在 iOS 中对 AVCaptureDevice 添加过饱和效果
Add Over Saturation Effect on AVCaptureDevice in iOS
我已经在我的应用程序中实现了自定义相机。所以,我正在使用 AVCaptureDevice
创建这个相机。我还使用 this.
在这个自定义相机上设置了 GrayScale
现在我想在相机上添加过饱和效果。 "Oversaturation hint" 应根据提供的公式计算。 (将过度曝光像素 (R,G,B >= 255) 转换为黄色 (RGB 255,255,0))。
我想要下图中显示的确切效果。
我正在使用以下代码创建 GrayScale:-
let sepiaColor = CIColor(
red: 1.0 / 0.30078125,
green: 1.0 / 0.5859375,
blue: 1.0 / 0.11328125
)
filter = CIFilter(
name: "CIColorMonochrome",
withInputParameters: [
"inputColor" : sepiaColor,
"inputIntensity" : 1.0
]
)
如何使用 CIFilter
创建这种过饱和效果?我已查看 CIFilter
的 Core Image Filter Reference 文档。但是不知道如何使用它来创建这种效果。也许
CIColorCrossPolynomial
或 CIColorMap
正在为此工作。
有什么方法可以在 AVCaptureDevice
上创建这种效果吗?
任何帮助将不胜感激。 :)
你的logic/algorithm:
(convert overexposure pixel (R,G,B >= 255) to yellow (RGB 255,255,0))
将进入内核,这实际上是您要对每个像素执行的计算。
这是我编写的一个简单过滤器。在内核的if条件中,写自己的条件。 then 部分已经将像素转换为 (255, 255, 0).
.h
#import <CoreImage/CoreImage.h>
@interface CustomFilter : CIFilter
@property(nonatomic, retain) CIImage *inputImage;
-(CIImage*)outputImage;
@end
.m
#import "CustomFilter.h"
@implementation CustomFilter
-(CIColorKernel*)myKernel
{
static CIColorKernel *kernel = nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
kernel = [CIColorKernel kernelWithString:
@"kernel vec4 CustomFilter ( __sample s ) \n { \n if ( s.r + s.g + s.b < 0.1 ) \n { return s.rgba = vec4(1.0, 1.0, 0.0, 1.0); } \n else \n { return s.rgba; } \n }"];
});
return kernel;
}
-(CIImage*)outputImage
{
CGRect dod = _inputImage.extent;
return [[self myKernel] applyWithExtent:dod arguments:@[_inputImage]];
}
@end
我已经在我的应用程序中实现了自定义相机。所以,我正在使用 AVCaptureDevice
创建这个相机。我还使用
现在我想在相机上添加过饱和效果。 "Oversaturation hint" 应根据提供的公式计算。 (将过度曝光像素 (R,G,B >= 255) 转换为黄色 (RGB 255,255,0))。
我想要下图中显示的确切效果。
我正在使用以下代码创建 GrayScale:-
let sepiaColor = CIColor(
red: 1.0 / 0.30078125,
green: 1.0 / 0.5859375,
blue: 1.0 / 0.11328125
)
filter = CIFilter(
name: "CIColorMonochrome",
withInputParameters: [
"inputColor" : sepiaColor,
"inputIntensity" : 1.0
]
)
如何使用 CIFilter
创建这种过饱和效果?我已查看 CIFilter
的 Core Image Filter Reference 文档。但是不知道如何使用它来创建这种效果。也许
CIColorCrossPolynomial
或 CIColorMap
正在为此工作。
有什么方法可以在 AVCaptureDevice
上创建这种效果吗?
任何帮助将不胜感激。 :)
你的logic/algorithm:
(convert overexposure pixel (R,G,B >= 255) to yellow (RGB 255,255,0))
将进入内核,这实际上是您要对每个像素执行的计算。
这是我编写的一个简单过滤器。在内核的if条件中,写自己的条件。 then 部分已经将像素转换为 (255, 255, 0).
.h
#import <CoreImage/CoreImage.h>
@interface CustomFilter : CIFilter
@property(nonatomic, retain) CIImage *inputImage;
-(CIImage*)outputImage;
@end
.m
#import "CustomFilter.h"
@implementation CustomFilter
-(CIColorKernel*)myKernel
{
static CIColorKernel *kernel = nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
kernel = [CIColorKernel kernelWithString:
@"kernel vec4 CustomFilter ( __sample s ) \n { \n if ( s.r + s.g + s.b < 0.1 ) \n { return s.rgba = vec4(1.0, 1.0, 0.0, 1.0); } \n else \n { return s.rgba; } \n }"];
});
return kernel;
}
-(CIImage*)outputImage
{
CGRect dod = _inputImage.extent;
return [[self myKernel] applyWithExtent:dod arguments:@[_inputImage]];
}
@end