Core Image滤镜使用大全(转载)

CoreImage框架是一个专门用来对图片进行处理的框架,其中提供了许多高级功能,可以帮助开发者完成UIKit或者CoreGraphics框架无法完成的任务,并且使用CoreImage框架可以十分轻松的实现滤镜以及图像识别等流行技术。本篇博客主要介绍和总结CoreImage框架的使用,并提供范例代码。

一、图像过滤器

1.几组内置的过滤器

CIFilter是CoreImage中提供的图像过滤器,也可以将其理解为滤镜。许多美颜应用,图像处理应用等都是为原图添加了滤镜效果。本节我们着重看下与这个类相关的应用。首先,CoreImaghe默认提供了非常多的滤镜效果,但是并没有详细的文档介绍,有关滤镜效果可以分为下面几个类别:

//通过改变图像的几何形状来创建3D效果,类似隆起 过滤器组NSString*constkCICategoryDistortionEffect;//旋转扭曲相关过滤器组NSString*constkCICategoryGeometryAdjustment;//混合过滤器组 对两个图像进行混合操作NSString*constkCICategoryCompositeOperation;//一种色调过滤器组 类似报纸风格NSString*constkCICategoryHalftoneEffect;//颜色过滤器组 调整对比度 亮度等NSString*constkCICategoryColorEffect;//多个图像源的过滤器NSString*constkCICategoryTransition;//平铺图像过滤器NSString*constkCICategoryTileEffect;//滤光类过滤器 通常作为其他过滤器的输入NSString*constkCICategoryGenerator;//减弱图像数据的过滤器 通常用来进行图像分析NSString*constkCICategoryReduction;//渐变过滤器 NSString*constkCICategoryGradient;//画像过滤器NSString*constkCICategoryStylize;//锐化过滤器NSString*constkCICategorySharpen;//模糊过滤器NSString*constkCICategoryBlur;//视频图片相关过滤器NSString*constkCICategoryVideo;//静态图片相关过滤器NSString*constkCICategoryStillImage;//交叉图像过滤器NSString*constkCICategoryInterlaced;//非矩形图像上的过滤器NSString*constkCICategoryNonSquarePixels;//高动态图像的过滤器NSString*constkCICategoryHighDynamicRange;//CoreImage内置的过滤器NSString*constkCICategoryBuiltIn;//复合的过滤器NSString*constkCICategoryFilterGenerator;

上面列出了非常多的类别,其实上面只是按照不同的场景将过滤器进行了分类,每个分类中都定义了许多内置的过滤器,使用下面的方法可以获取每个分类下提供的过滤器:

//获取某个分类的所有过滤器名+(NSArray*)filterNamesInCategory:(nullable NSString*)category;//获取一组分类下的所有过滤器名+(NSArray*)filterNamesInCategories:(nullable NSArray*)categories;

2.过滤器的一个简单示例

下面示例代码演示过滤器的简单应用:

UIImage*img=[UIImage imageNamed:@"1.png"];CIImage*image=[[CIImage alloc]initWithImage:img];CIFilter*filter=[CIFilter filterWithName:@"CIBoxBlur"keysAndValues:kCIInputImageKey,image,nil];[filter setDefaults];CIContext*context=[[CIContext alloc]initWithOptions:nil];CIImage*output=[filter outputImage];CGImageRef ref=[context createCGImage:output fromRect:[output extent]];UIImage*newImage=[UIImage imageWithCGImage:ref];CGImageRelease(ref);UIImageView*imageView=[[UIImageView alloc]initWithFrame:CGRectMake(170,30,150,400)];imageView.image=newImage;[self.view addSubview:imageView];UIImageView*imageView2=[[UIImageView alloc]initWithFrame:CGRectMake(0,30,150,400)];imageView2.image=img;[self.view addSubview:imageView2];

效果如下图:

image

上面演示了简单的模糊过滤效果。

3.对CIFilter类进行解析

CIFilter类的解析如下:

//过滤后输出的图像@property(readonly,nonatomic,nullable)CIImage*outputImage;//过滤器名称@property(nonatomic,copy)NSString*name;//是否开启CoreAnimation动画效果@property(getter=isEnabled)BOOL enabled;//返回当前过滤器所有支持的输入键@property(nonatomic,readonly)NSArray*inputKeys;//返回当前过滤器所有支持的输出键@property(nonatomic,readonly)NSArray*outputKeys;//将过滤器的所有输入值设置为默认值-(void)setDefaults;//返回当前过滤器的属性字段/*

需要注意这个字段对于学习此过滤器非常有用

其中会声明此过滤器的输入和输出 即如果使用

*/@property(nonatomic,readonly)NSDictionary*attributes;//用来进行过滤器的自定义 后面会介绍-(nullable CIImage*)apply:(CIKernel*)k                  arguments:(nullable NSArray*)args                    options:(nullable NSDictionary*)dict;//同上-(nullable CIImage*)apply:(CIKernel*)k,...;//根据过滤器的名称创建过滤器+(nullable CIFilter*)filterWithName:(NSString*)name;//创建过滤器 同时进行配置+(nullable CIFilter*)filterWithName:(NSString*)name                        keysAndValues:key0,...;+(nullable CIFilter*)filterWithName:(NSString*)name                  withInputParameters:(nullable NSDictionary*)params;//注册过滤器+(void)registerFilterName:(NSString*)name              constructor:(id)anObject          classAttributes:(NSDictionary*)attributes;//将一组过滤器进行编码+(nullable NSData*)serializedXMPFromFilters:(NSArray*)filters                            inputImageExtent:(CGRect)extent;//进行反编码+(NSArray*)filterArrayFromSerializedXMP:(NSData*)xmpData                                    inputImageExtent:(CGRect)extent                                                error:(NSError**)outError;

4.常用过滤器详解

区域凸起过滤器

这个过滤器的作用是在图片的某个区域创建一块凸起。示例代码如下:

/*

kCIInputCenterKey键用来设置滤镜中心

kCIInputScaleKey 设置为0则没有影响 1则会凸起效果 -1则会凹入效果

kCIInputRadiusKey 设置滤镜的影响范围

*/CIFilter*filter=[CIFilter filterWithName:@"CIBumpDistortion"keysAndValues:kCIInputImageKey,image,kCIInputCenterKey,[[CIVector alloc]initWithX:100Y:200],kCIInputScaleKey,@-1,kCIInputRadiusKey,@150,nil];

效果如下:

image

线性凹凸过滤器

这个过滤器创建类似波纹效果,示例如下:

/*

与上一个过滤器相比 可以设置

kCIInputAngleKey 角度 0-2π

*/CIFilter*filter=[CIFilter filterWithName:@"CIBumpDistortionLinear"keysAndValues:kCIInputImageKey,image,kCIInputCenterKey,[[CIVector alloc]initWithX:100Y:200],kCIInputScaleKey,@-1,kCIInputRadiusKey,@150,kCIInputAngleKey,@(M_PI_2),nil];

效果如下:

image

圆形飞溅过滤器

这个过滤器的作用是选取图像的某个区域,对其四周进行飞溅拉伸,例如:

CIFilter*filter=[CIFilter filterWithName:@"CICircleSplashDistortion"keysAndValues:kCIInputImageKey,image,kCIInputCenterKey,[[CIVector alloc]initWithX:100Y:200],kCIInputRadiusKey,@50,nil];

效果如下:

image

圆形缠绕过滤器

这个过滤器选取某个区域,进行缠绕效果,例如:

CIFilter*filter=[CIFilter filterWithName:@"CICircularWrap"keysAndValues:kCIInputImageKey,image,kCIInputCenterKey,[[CIVector alloc]initWithX:100Y:200],kCIInputRadiusKey,@20,kCIInputAngleKey,@3,nil];

效果如下:

image

灰度混合过滤器

这个过滤器将提供混合图像的灰度值应用于目标图像,例如:

/*

inputDisplacementImage设置要混合的灰度图片

*/CIFilter*filter=[CIFilter filterWithName:@"CIDroste"keysAndValues:kCIInputImageKey,image,kCIInputScaleKey,@200,@"inputDisplacementImage",image2,nil];

效果如下:

image

递归绘制图像区域

CIFilter*filter=[CIFilter filterWithName:@"CIDroste"keysAndValues:kCIInputImageKey,image,@"inputInsetPoint0",[[CIVector alloc]initWithX:100Y:100],@"inputInsetPoint1",[[CIVector alloc]initWithX:200Y:200],@"inputPeriodicity",@1,@"inputRotation",@0,@"inputStrands",@1,@"inputZoom",@1,nil];

效果如下:

image

玻璃纹理过滤器

这个过滤器用提供图片作为目标图片的纹理,进行混合,例如:

/*

inputTexture设置纹理图像

*/CIFilter*filter=[CIFilter filterWithName:@"CIGlassDistortion"keysAndValues:kCIInputImageKey,image,kCIInputCenterKey,[[CIVector alloc]initWithX:100Y:200],kCIInputScaleKey,@100,@"inputTexture",image2,nil];

效果如下:

image

菱形透镜过滤器

/*

inputPoint0设置第一个圆的圆心

inputPoint1设置第二个圆的圆心

inputRadius设置半径

inputRefraction设置折射率 0-5之间

*/CIFilter*filter=[CIFilter filterWithName:@"CIGlassLozenge"keysAndValues:kCIInputImageKey,image,@"inputPoint0",[[CIVector alloc]initWithX:100Y:200],@"inputPoint1",[[CIVector alloc]initWithX:200Y:200],@"inputRadius",@100,@"inputRefraction",@2,nil];

效果如下:

image

圆孔形变过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIHoleDistortion"keysAndValues:kCIInputImageKey,image,@"inputRadius",@50,kCIInputCenterKey,[[CIVector alloc]initWithX:100Y:200],nil];

效果如下:

image

九宫格拉伸过滤器

CIFilter*filter=[CIFilter filterWithName:@"CINinePartStretched"keysAndValues:kCIInputImageKey,image2,@"inputBreakpoint0",[[CIVector alloc]initWithX:50Y:50],@"inputBreakpoint1",[[CIVector alloc]initWithX:100Y:100],@"inputGrowAmount",[[CIVector alloc]initWithX:50Y:50],nil];

效果如下:

image

九宫格复制过滤器

CIFilter*filter=[CIFilter filterWithName:@"CINinePartTiled"keysAndValues:kCIInputImageKey,image2,@"inputBreakpoint0",[[CIVector alloc]initWithX:50Y:50],@"inputBreakpoint1",[[CIVector alloc]initWithX:100Y:100],@"inputGrowAmount",[[CIVector alloc]initWithX:50Y:50],@"inputFlipYTiles",@1,nil];

效果如下:

image

紧缩过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIPinchDistortion"keysAndValues:kCIInputImageKey,image2,@"inputCenter",[[CIVector alloc]initWithX:150Y:150],@"inputRadius",@500,@"inputScale",@1,nil];

效果如下:

image

拉伸裁剪过滤器

/*

inputSize 设置拉伸裁剪尺寸

*/CIFilter*filter=[CIFilter filterWithName:@"CIStretchCrop"keysAndValues:kCIInputImageKey,image2,@"inputCenterStretchAmount",@1,@"inputCropAmount",@0.5,@"inputSize",[[CIVector alloc]initWithX:300Y:150],nil];

效果如下:

image

环状透镜过滤器

这个过滤器创建一个环状透镜,对图像进行扭曲。

/*

inputCenter设置环中心

inputRadius 设置半径

inputRefraction 设置折射率

inputWidth 设置环宽度

*/CIFilter*filter=[CIFilter filterWithName:@"CITorusLensDistortion"keysAndValues:kCIInputImageKey,image2,@"inputCenter",[[CIVector alloc]initWithX:150Y:150],@"inputRadius",@150,@"inputRefraction",@1.6,@"inputWidth",@40,nil];

效果如下:

image

旋转过滤器

CIFilter*filter=[CIFilter filterWithName:@"CITwirlDistortion"keysAndValues:kCIInputImageKey,image2,@"inputAngle",@3.14,@"inputCenter",[[CIVector alloc]initWithX:150Y:150],@"inputRadius",@150,nil];

效果如下:

image

涡流过滤器

//inputAngle 设置涡流角度CIFilter*filter=[CIFilter filterWithName:@"CIVortexDistortion"keysAndValues:kCIInputImageKey,image2,@"inputAngle",@(M_PI*10),@"inputCenter",[[CIVector alloc]initWithX:150Y:150],@"inputRadius",@150,nil];

效果如下:

image

形变过滤器

这个过滤器对图像进行简单的形变处理,如缩放,旋转,平移等。

CGAffineTransform tr=CGAffineTransformMakeRotation(M_PI_2);CIFilter*filter=[CIFilter filterWithName:@"CIAffineTransform"keysAndValues:kCIInputImageKey,image2,@"inputTransform",[NSValue valueWithCGAffineTransform:tr],nil];

效果如下:

image

矩形裁剪过滤器

CIFilter*filter=[CIFilter filterWithName:@"CICrop"keysAndValues:kCIInputImageKey,image2,@"inputRectangle",[[CIVector alloc]initWithCGRect:CGRectMake(0,0,150,150)],nil];

效果如下:

image

边缘采样过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIEdgePreserveUpsampleFilter"keysAndValues:kCIInputImageKey,image,@"inputLumaSigma",@0.15,@"inputSpatialSigma",@3,@"inputSmallImage",image2,nil];

效果如下:

image

矩形矫正过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIPerspectiveCorrection"keysAndValues:kCIInputImageKey,image2,@"inputBottomLeft",[[CIVector alloc]initWithX:0Y:0],@"inputBottomRight",[[CIVector alloc]initWithX:150Y:0],@"inputTopLeft",[[CIVector alloc]initWithX:0Y:150],@"inputTopRight",[[CIVector alloc]initWithX:150Y:150],nil];

效果如图:

image

旋转矫正过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIStraightenFilter"keysAndValues:kCIInputImageKey,image2,@"inputAngle",@3.14,nil];

效果如下:

image

背景混合过滤器

通过提供一个图像作为背景与目标图像进行混合。

CIFilter*filter=[CIFilter filterWithName:@"CIAdditionCompositing"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

色彩混合过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIColorBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

暗混合过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIColorBurnBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

亮混合过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIColorDodgeBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

image

暗选择混合模式过滤器

这个过滤器将选择较暗的图像作为混合背景,例如:

CIFilter*filter=[CIFilter filterWithName:@"CIDarkenBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

亮选择混合模式过滤器

这个过滤器将选择较亮的图像作为混合背景,例如:

CIFilter*filter=[CIFilter filterWithName:@"CIDifferenceBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

分开混合模式过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIDivideBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

排除混合模式过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIExclusionBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

强光混合模式过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIHardLightBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

色调混合模式过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIHueBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

减轻混合模式过滤器

CIFilter*filter=[CIFilter filterWithName:@"CILightenBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

线性燃烧混合模式过滤器

CIFilter*filter=[CIFilter filterWithName:@"CILinearBurnBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

线性高亮混合过滤器

CIFilter*filter=[CIFilter filterWithName:@"CILinearDodgeBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

亮度混合过滤器

CIFilter*filter=[CIFilter filterWithName:@"CILuminosityBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

最大值混合过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIMaximumCompositing"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

最小值混合过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIMinimumCompositing"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

多重混合过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIMultiplyBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

效果如下:

image

多重合成过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIMultiplyCompositing"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

image

重叠混合模式

CIFilter*filter=[CIFilter filterWithName:@"CIOverlayBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

image

亮混合模式

CIFilter*filter=[CIFilter filterWithName:@"CIPinLightBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

image

饱和混合模式

CIFilter*filter=[CIFilter filterWithName:@"CISaturationBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

image

屏幕混合模式

CIFilter*filter=[CIFilter filterWithName:@"CIScreenBlendMode"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

image

源图像上层混合

CIFilter*filter=[CIFilter filterWithName:@"CISourceAtopCompositing"keysAndValues:kCIInputImageKey,image2,@"inputBackgroundImage",image,nil];

image

圆屏过滤器

/*

inputSharpness 设置圆圈锐度

inputWidth 设置间距

*/CIFilter*filter=[CIFilter filterWithName:@"CICircularScreen"keysAndValues:kCIInputImageKey,image2,kCIInputCenterKey,[[CIVector alloc]initWithX:150Y:150],@"inputSharpness",@0.7,@"inputWidth",@6,nil];

image

半色调过滤器

CIFilter*filter=[CIFilterfilterWithName:@"CICMYKHalftone"keysAndValues:kCIInputImageKey,image2,@"inputAngle",@0,kCIInputCenterKey,[[CIVectoralloc]initWithX:150Y:150],@"inputGCR",@1,@"inputSharpness",@0.7,@"inputUCR",@0.5,@"inputWidth",@6,nil];

image

点屏过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIDotScreen"keysAndValues:kCIInputImageKey,image2,@"inputAngle",@0,kCIInputCenterKey,[[CIVector alloc]initWithX:150Y:150],@"inputSharpness",@0.7,@"inputWidth",@6,nil];

image

阴影屏过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIHatchedScreen"keysAndValues:kCIInputImageKey,image2,@"inputAngle",@0,kCIInputCenterKey,[[CIVector alloc]initWithX:150Y:150],@"inputSharpness",@0.7,@"inputWidth",@6,nil];

image

线性sRGB过滤器

CIFilter*filter=[CIFilter filterWithName:@"CILinearToSRGBToneCurve"keysAndValues:kCIInputImageKey,image2,nil];

image

色彩翻转过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIColorInvert"keysAndValues:kCIInputImageKey,image2,nil];

image

色图过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIColorMap"keysAndValues:kCIInputImageKey,image2,@"inputGradientImage",image,nil];

image

单色过滤器

/*

inputColor 设置输入颜色

inputIntensity 设置影响程度

*/CIFilter*filter=[CIFilter filterWithName:@"CIColorMonochrome"keysAndValues:kCIInputImageKey,image2,@"inputColor",[CIColor colorWithRed:0.5green:0.5blue:0.5],@"inputIntensity",@1,nil];

image

分色镜过滤器

/*

inputLevels设置亮度级别

*/CIFilter*filter=[CIFilter filterWithName:@"CIColorPosterize"keysAndValues:kCIInputImageKey,image2,@"inputLevels",@6,nil];

image

反色过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIFalseColor"keysAndValues:kCIInputImageKey,image2,@"inputColor0",[CIColor colorWithRed:0green:0blue:0],@"inputColor1",[CIColor colorWithRed:1green:1blue:0],nil];

image

光效褪色过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIPhotoEffectFade"keysAndValues:kCIInputImageKey,image2,nil];

image

光效瞬时过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIPhotoEffectInstant"keysAndValues:kCIInputImageKey,image2,nil];

image

光效单光过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIPhotoEffectMono"keysAndValues:kCIInputImageKey,image2,nil];

image

黑色光效应过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIPhotoEffectNoir"keysAndValues:kCIInputImageKey,image2,nil];

image

光渐进过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIPhotoEffectProcess"keysAndValues:kCIInputImageKey,image2,nil];

image

光转移过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIPhotoEffectTransfer"keysAndValues:kCIInputImageKey,image2,nil];

image

棕褐色过滤器

CIFilter*filter=[CIFilter filterWithName:@"CISepiaTone"keysAndValues:kCIInputImageKey,image2,nil];

image

热图过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIThermal"keysAndValues:kCIInputImageKey,image2,nil];

image

X射线过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIXRay"keysAndValues:kCIInputImageKey,image2,nil];

image

模糊过滤器

//参数进行模糊效果的设置CIFilter*filter=[CIFilter filterWithName:@"CIBokehBlur"keysAndValues:kCIInputImageKey,image2,@"inputSoftness",@0.5,@"inputRingSize",@0.1,@"inputRingAmount",@0,@"inputRadius",@10,nil];

image

盒模糊过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIBoxBlur"keysAndValues:kCIInputImageKey,image2,@"inputRadius",@10,nil];

image

阀瓣模糊过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIDiscBlur"keysAndValues:kCIInputImageKey,image2,@"inputRadius",@25,nil];

image

高斯模糊过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIGaussianBlur"keysAndValues:kCIInputImageKey,image2,@"inputRadius",@10,nil];

image

梯度模糊过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIMorphologyGradient"keysAndValues:kCIInputImageKey,image2,@"inputRadius",@5,nil];

image

运动模糊过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIMotionBlur"keysAndValues:kCIInputImageKey,image2,@"inputRadius",@5,nil];

image

缩放模糊过滤器

CIFilter*filter=[CIFilter filterWithName:@"CIZoomBlur"keysAndValues:kCIInputImageKey,image2,nil];

image

5.自定义过滤器

上面演示了非常多的常用内置过滤器,我们也可以通过继承CIFilter来自定义过滤器。

自定义过滤器之前,首先需要了解CIKernel这个类,CIKernel是Core Image Kernel Language 的抽象对象。CIKL是CoreImage中专门用来编写像素处理函数的语言。

CIKernel相关类解析如下:

//基类 用于通用的过滤函数@interfaceCIKernel:NSObject//从字符串加载一组过滤函数+(nullable NSArray*)kernelsWithString:(NSString*)string;//从字符串加载一个过滤函数+(nullable instancetype)kernelWithString:(NSString*)string;//名称@property(atomic,readonly)NSString*name;//进行图片生成-(nullable CIImage*)applyWithExtent:(CGRect)extent                          roiCallback:(CIKernelROICallback)callback                            arguments:(nullable NSArray*)args;@end//用于颜色修正的过滤函数@interfaceCIColorKernel:CIKernel+(nullable instancetype)kernelWithString:(NSString*)string;-(nullable CIImage*)applyWithExtent:(CGRect)extent                            arguments:(nullable NSArray*)args;@end//用于形状修正的过滤函数@interfaceCIWarpKernel:CIKernel+(nullable instancetype)kernelWithString:(NSString*)string;@end//用于色彩混合的过滤函数@interfaceCIBlendKernel:CIColorKernel+(nullable instancetype)kernelWithString:(NSString*)string;-(nullable CIImage*)applyWithForeground:(CIImage*)foreground                              background:(CIImage*)background;@end

下面是一个简单的翻转图像的自定义过滤器示意,首先新建一个新的cikernel文件,命名为a.cikernel,如下:

kernel vec2 mirrorX(floatimageWidth){// 获取待处理点的位置vec2 currentVec=destCoord();// 返回最终显示位置returnvec2(imageWidth-currentVec.x,currentVec.y);}

新建一个过滤器类,命名为MyFilter,如下:

#import@interfaceMyFilter:CIFilter@property(nonatomic,strong)CIImage*inputImage;@end#import"MyFilter.h"@interfaceMyFilter()@property(nonatomic,strong)CIWarpKernel*kernel;@end@implementationMyFilter-(instancetype)init{self=[superinit];if(self){//从文件读取过滤函数NSBundle*bundle=[NSBundle bundleForClass:[selfclass]];NSURL*kernelURL=[bundle URLForResource:@"a"withExtension:@"cikernel"];NSError*error;NSString*kernelCode=[NSString stringWithContentsOfURL:kernelURL                                                            encoding:NSUTF8StringEncoding error:&error];NSArray*kernels=[CIKernel kernelsWithString:kernelCode];self.kernel=[kernels objectAtIndex:0];}returnself;}-(CIImage*)outputImage{CGFloat inputWidth=self.inputImage.extent.size.width;CIImage*result=[self.kernel applyWithExtent:self.inputImage.extent roiCallback:^CGRect(intindex,CGRect destRect){returndestRect;}inputImage:self.inputImage arguments:@[@(inputWidth)]];returnresult;}//设置说明字典-(NSDictionary*)attributes{return@{@"inputImage":@{@"CIAttributeClass":@"CIImage",@"CIAttributeDisplayName":@"Image--",@"CIAttributeType":@"CIAttributeTypeImage"}};}@end

如下进行使用即可:

MyFilter*filter=[[MyFilter alloc]init];filter.inputImage=image2;CIContext*context=[[CIContext alloc]initWithOptions:nil];CIImage*output=[filter outputImage];CGImageRef ref=[context createCGImage:output fromRect:output.extent];UIImage*newImage=[UIImage imageWithCGImage:ref];

作者:半岛夏天

链接:https://www.jianshu.com/p/6433584e14b6

来源:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Core Image滤镜使用大全(转载))