iOS图片编辑(CIFilter)
2015-11-23 11:14
411 查看
在iOS中开发过程中,如果你想对图片进行简单的处理,那么很简单,苹果帮我们封装了一套简单易用的API——CIFilter。
使用CIFilter你可以做到:调节图片亮度、对比度、饱和度等图片基本的操作;使用模糊、锐化、高反差等对图片进行滤镜处理。
CIGaussianBlur、CIMotionBlur、CIZoomBlur等。
在xcode7等新版本中,你可以直接导入CIFilter.h头文件进行下一步的开发。
直接进入CIFilter头文件你可以找到所有的category常量:
对应category的所有子类,你只需要:
或者查阅相关的官方文档:
Core Image Filter Reference
对于单个的category你也许不知道有哪些attribute值是可调整的,,或者某个值的取值范围,那么你也只需要:
需求:对某个视图添加模糊蒙版。
实现方式:截取当前视图为一张图片,对图片进行高斯模糊,显示图片到当前视图作为蒙版。
问题:直接调节图片的高斯模糊值,会使图片边缘趋于透明或者模糊不明显,并且高斯模糊半径值越大,边缘透明部分越多。
解决方案:结合CIAffineClamp和CIGaussianBlur同时使用。
部分UIImageCategory代码:
令,如果想要对图片进行特征识别等特殊的操作,你也不妨学习了解一下一套非常强大的三方c++图片处理库——Opencv。
使用CIFilter你可以做到:调节图片亮度、对比度、饱和度等图片基本的操作;使用模糊、锐化、高反差等对图片进行滤镜处理。
一、基本概念
1、CIFilterCategory。
图片处理的方式方法种类繁多,在CIFiler中是如何对这么多的图片处理方式进行归类的呢?苹果采用的是Category的形式。比如上文提到的图片亮度、对比度、饱和度等颜色处理都属于CICategoryColorAdjustment,图片模糊处理对应CICategoryBlur,图片锐化则对应CICategorySharpen。2.CIFilterName
在图片处理中,除了大的种类划分之外,每一种类还有对应的不同处理方式,比如CICategoryBlur可以分为CIBoxblur、CIDiscblur、CIGaussianBlur、CIMotionBlur、CIZoomBlur等。
3.attributes
要想对图片进行某一种处理,必须要调节对应属性的属性值,对于CIFilter来讲也就是filter对象的attributes。每一个CIFiler对象都包含attributes属性,并且其中相应的值在一定的区间内是可变动的,以此来作为图片对应属性处理的参数。4.inputImage && outputImage
使用CIFilter对图片进行处理,CIFliter对象相当于设置了一系列参数的过滤器,将原始图片输入,输出使用相应参数处理后的图片。二、使用CIFiler
1.准备工作
如果你使用较早版本的xcode,你可能需要导入一个动态库framework在xcode7等新版本中,你可以直接导入CIFilter.h头文件进行下一步的开发。
2.创建一个CIFilter对象,并修改一种属性值,输出UIImage
由于在日常的iOS开发中,我们常用的图片对象是UIImage,它是属于UIKit.framework的,而CIFilter是属于Coreimage.framework。他们之间是不能直接进行转化的,这就需要借助中间层——CoreGraphics.framework。UIImage *inputImageUI = [UIImage imageNamed:@"1"]; CIImage *inputImageCI = [CIImage imageWithCGImage:inputImageUI.CGImage]; CIFilter *filterCI = [CIFilter filterWithName:filterName]; [filterCI setValue:inputImageCI forKey:kCIInputImageKey]; // 调节图片亮度 [filterCI setValue:[NSNumber numberWithFloat:0.6] forKey:@"inputBrightness"]; CIImage *outputImage = [filterCI outputImage]; CIContext *contextCI = [CIContext contextWithOptions:nil]; CGImageRef targetImageCG = [contextCI createCGImage:outputImage fromRect:[inputImageCI extent]]; UIImage *targetImage = [UIImage imageWithCGImage:targetImageCG]; CGImageRelease(targetImageCG);
3.使用小技巧
CIFilter中包含很多的category,每个category又包含很多的Filter,如何找到自己需要的某个Filter呢。直接进入CIFilter头文件你可以找到所有的category常量:
/* Categories */ CORE_IMAGE_EXPORT NSString * const kCICategoryDistortionEffect; CORE_IMAGE_EXPORT NSString * const kCICategoryGeometryAdjustment; CORE_IMAGE_EXPORT NSString * const kCICategoryCompositeOperation; CORE_IMAGE_EXPORT NSString * const kCICategoryHalftoneEffect; CORE_IMAGE_EXPORT NSString * const kCICategoryColorAdjustment; CORE_IMAGE_EXPORT NSString * const kCICategoryColorEffect; CORE_IMAGE_EXPORT NSString * const kCICategoryTransition; CORE_IMAGE_EXPORT NSString * const kCICategoryTileEffect; CORE_IMAGE_EXPORT NSString * const kCICategoryGenerator; CORE_IMAGE_EXPORT NSString * const kCICategoryReduction NS_AVAILABLE(10_5, 5_0); CORE_IMAGE_EXPORT NSString * const kCICategoryGradient; CORE_IMAGE_EXPORT NSString * const kCICategoryStylize; CORE_IMAGE_EXPORT NSString * const kCICategorySharpen; CORE_IMAGE_EXPORT NSString * const kCICategoryBlur; CORE_IMAGE_EXPORT NSString * const kCICategoryVideo; CORE_IMAGE_EXPORT NSString * const kCICategoryStillImage; CORE_IMAGE_EXPORT NSString * const kCICategoryInterlaced; CORE_IMAGE_EXPORT NSString * const kCICategoryNonSquarePixels; CORE_IMAGE_EXPORT NSString * const kCICategoryHighDynamicRange; CORE_IMAGE_EXPORT NSString * const kCICategoryBuiltIn; CORE_IMAGE_EXPORT NSString * const kCICategoryFilterGenerator NS_AVAILABLE(10_5, 9_0);
对应category的所有子类,你只需要:
NSLog(@"%@", [CIFilter filterNamesInCategory:kCICategoryBuiltIn]);
或者查阅相关的官方文档:
Core Image Filter Reference
对于单个的category你也许不知道有哪些attribute值是可调整的,,或者某个值的取值范围,那么你也只需要:
NSLog(@"%@", [[CIFilter filterWithName:@"CIColorControls"] attributes]);
4.个人使用中遇到的问题(待完善)
本人在使用CIFilter的过程中曾经遇到一个模糊处理的问题,在这里简单描述一下问题和处理办法。需求:对某个视图添加模糊蒙版。
实现方式:截取当前视图为一张图片,对图片进行高斯模糊,显示图片到当前视图作为蒙版。
问题:直接调节图片的高斯模糊值,会使图片边缘趋于透明或者模糊不明显,并且高斯模糊半径值越大,边缘透明部分越多。
解决方案:结合CIAffineClamp和CIGaussianBlur同时使用。
部分UIImageCategory代码:
- (UIImage *)adjustImageAffineClampAndBlurImageWithGaussianRadiusValue:(CGFloat)radiusValue { CIContext *context = [CIContext contextWithOptions:nil]; CIImage *sourceImage = [CIImage imageWithCGImage:self.CGImage]; NSString *clampFilterName = @"CIAffineClamp"; CIFilter *clamp = [CIFilter filterWithName:clampFilterName]; [clamp setValue:sourceImage forKey:kCIInputImageKey]; CIImage *clampResult = [clamp valueForKey:kCIOutputImageKey]; NSString *gaussianBlurFilterName = @"CIGaussianBlur"; CIFilter *gaussianBlur = [CIFilter filterWithName:gaussianBlurFilterName]; [gaussianBlur setValue:clampResult forKey:kCIInputImageKey]; [gaussianBlur setValue:[NSNumber numberWithFloat:radiusValue] forKey:@"inputRadius"]; CIImage *gaussianBlurResult = [gaussianBlur valueForKey:kCIOutputImageKey]; CGImageRef cgImage = [context createCGImage:gaussianBlurResult fromRect:[sourceImage extent]]; UIImage *blurredImage = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); return blurredImage; }
小结:
CIFilter的使用十分简单,而且功能相当强大,基本可以满足应用中对图片处理的大部分需求,希望本文可以帮你解决图片处理的问题。令,如果想要对图片进行特征识别等特殊的操作,你也不妨学习了解一下一套非常强大的三方c++图片处理库——Opencv。
相关文章推荐
- iOS中的cell自适应高度--StoryBorad
- iOS笔记--oc语法4 (内存管理以及内存的分区)
- ios动画
- iOS 开发 OpenGL 新手入门
- ios NSString format 保留小数点 float double
- iOS 跳转
- iOS开发者遇到审核失败的原因及解决办法
- iOS——特殊的几个控件
- ios加速审核
- iOS——关于打印
- 如何更改 iOS7 中的未选定的 tabbaritem 颜色
- IOS多线程编程的3种实现方法
- iOS开发中CAlayer层的属性以及自定义层的方法
- IOS开篇
- iOS 阿拉伯数字转汉字(1转一)
- iOS中发送短信/发送邮件的实现 韩俊强的博客
- iOS中发送短信/发送邮件的实现 韩俊强的博客
- iOS开发进阶-实现多线程的3种方法
- iOS---自动布局
- 自己对于instancetype的理解和应用iOS开发的过程