您的位置:首页 > 移动开发 > IOS开发

iOS图片编辑(CIFilter)

2015-11-23 11:14 411 查看
在iOS中开发过程中,如果你想对图片进行简单的处理,那么很简单,苹果帮我们封装了一套简单易用的API——CIFilter。

使用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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: