在iOS中的AVCaptureDevice上添加过饱和效应

在iOS中的AVCaptureDevice上添加过饱和效应,ios,objective-c,swift,cifilter,avcapturedevice,Ios,Objective C,Swift,Cifilter,Avcapturedevice,我已经在我的应用程序中实现了自定义摄像头。因此,我正在使用AVCaptureDevice创建此相机。此外,我还设置了灰度在这个自定义相机使用这个 现在我想在相机上添加过饱和效果。“过饱和提示”应根据提供的公式计算。(将过度曝光像素(R、G、B>=255)转换为黄色(RGB 255255,0)) 我想要在下图中显示的确切效果 我正在使用以下代码创建灰度:- let sepiaColor = CIColor( red: 1.0 / 0.30078125, green: 1.0 /

我已经在我的应用程序中实现了自定义摄像头。因此,我正在使用
AVCaptureDevice
创建此相机。此外,我还设置了灰度在这个自定义相机使用这个

现在我想在相机上添加过饱和效果。“过饱和提示”应根据提供的公式计算。(将过度曝光像素(R、G、B>=255)转换为黄色(RGB 255255,0))

我想要在下图中显示的确切效果

我正在使用以下代码创建灰度:-

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
的文档。但是我不知道如何用这个来创造这种效果。可能是
CIColorCrossPolymonent
CIColorMap
正在为此工作

有没有办法在
AVCaptureDevice
上产生这种效果

任何帮助都将不胜感激。:)

您的逻辑/算法:

(将过度曝光像素(R、G、B>=255)转换为黄色(RGB 255255,0))

将进入内核,这本质上是您希望对每个像素执行的计算

这是我写的一个简单的过滤器。在内核的if条件中,编写自己的条件。then部件已将像素转换为(255、255、0)

.h

#import <CoreImage/CoreImage.h>

@interface CustomFilter : CIFilter

@property(nonatomic, retain) CIImage *inputImage;

-(CIImage*)outputImage;

@end
#导入
@接口CustomFilter:CIFilter
@属性(非原子,保留)CIImage*inputImage;
-(CIImage*)输出图像;
@结束
.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
#导入“CustomFilter.h”
@自定义过滤器的实现
-(CIColorKernel*)myKernel
{
静态CIColorKernel*内核=nil;
静态调度一次\u t一次;
发送一次(&U)^{
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}”;
});
返回内核;
}
-(CIImage*)输出图像
{
CGRect dod=_inputImage.extent;
返回[[self myKernel]applyWithExtent:dod参数:@[\u inputImage]];
}
@结束

我会创建自己的过滤器。您可以按照以下步骤进行操作:本WWDC解释了如何做到这一点:谢谢@KunalShrivastava。请为此提供任何示例代码。所以这对我很好。当你说“将过度曝光像素(R,G,B>=255)转换为黄色(RGB 255255,0)”时,你的意思是转换(R+G+B)值大于或等于255的像素吗?太好了@kunal。它起作用了。谢谢我正在使用此条件s.r+s.g+s.b>=1.0,而不是您的条件。再次感谢你。