一、Core Image 简介
Core Image is an image processing and analysis technology designed to provide near real-time processing for still and video images. It operates on image data types from the Core Graphics, Core Video, and Image I/O frameworks, using either a GPU or CPU rendering path. Core Image hides the details of low-level graphics processing by providing an easy-to-use application programming interface (API). You don’t need to know the details of OpenGL or OpenGL ES to leverage the power of the GPU, nor do you need to know anything about Grand Central Dispatch (GCD) to get the benefit of multicore processing. Core Image handles the details for you.
以上是苹果官方文档对 Core Image 的介绍,大意是:Core Image 是一种为静态图像和视频提供处理和分析的技术。它可以使用 GPU/CPU 的方式对图像进行处理。Core Image 提供了简洁的 API 给用户,隐藏了图像处理中复杂的底层内容。你可以在不了解 OpenGL、OpenGL ES 甚至是 GCD 的基础上对其进行使用,它已经帮你对这些复杂的内容进行处理了。
在 iOS 中,Core Image 框架是 iOS5 新加入到 iOS 平台的图像处理框架,提供了强大、高效的图像处理方式,用来对基于像素的图像进行操作与分析,内置了很多强大的滤镜(Filter)(目前数量超过了180个)。这些滤镜提供了各种各样的效果,并且可以通过滤镜链将各种效果叠加起来,形成强大的自定义效果。
二、Core Image 框架使用
Core Image 的 API 主要就是三类:
- CIImage:保存图像数据的类。可以通过 UIImage、图像文件或者像素数据来创建,包括未处理的像素数据。
- CIFilter:表示应用的滤镜。框架中对图片属性进行细节处理的类。它对所有的像素进行操作,用一些键值设置来决定具体操作的程度。
- CIContext:表示上下文,如 Core Graphics 以及 Core Data 中的上下文用于处理绘制渲染以及处理托管对象一样,Core Image 的上下文也是实现对图像处理的具体对象。可以从其中取得图片的信息。
三、滤镜和滤镜链
一个滤镜是一个对象,有很多输入和输出,并执行一些变化。例如,模糊滤镜可能需要输入图像和模糊半径来产生适当的模糊后的输出图像。
一个滤镜链是一个链接在一起的滤镜网络,使得一个滤镜的输出可以是另一个滤镜的输入。以这种方式,可以实现精心制作的效果。
高斯模糊效果示例:
+ (UIImage *)gaussianBlurImageWithImageName:(NSString *)imageName {
//1.创建CIImage对象
CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:imageName]];
//2.创建滤镜对象(高斯模糊),并设置参数
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setValue:@(15) forKey:@"inputRadius"];
//3.渲染并输出到CIImage
CIImage *outputImage = filter.outputImage;
//4.创建绘制上下文对象
CIContext *context = [CIContext contextWithOptions:nil];
//5.创建输出CGImage,注意是耗时操作
CGImageRef cgImage = [context createCGImage:outputImage fromRect:outputImage.extent];
UIImage *image = [UIImage imageWithCGImage:cgImage];
//6.释放CGImage
CGImageRelease(cgImage);
return image;
}
效果如图:
四、滤镜的获取以及属性设置
Core Image 框架中包含了很多滤镜,那么我们如何知道具体有哪些滤镜呢?又如何知道每一种滤镜的具体用法呢?我们可以从 CIFilter 的头文件中找到以 kCICategory 开头的滤镜分类,然后通过 CIFilter 提供的类方法得到对应分类下的所有滤镜。以 kCICategoryBlur 这个分类为例:
NSArray *filters = [CIFilter filterNamesInCategory:kCICategoryBlur];
NSLog(@"filters: %@", filters);
/*
打印结果:
filters: (
CIBokehBlur,
CIBoxBlur,
CIDepthBlurEffect,
CIDiscBlur,
CIGaussianBlur,
CIMaskedVariableBlur,
CIMedianFilter,
CIMorphologyGradient,
CIMorphologyMaximum,
CIMorphologyMinimum,
CIMotionBlur,
CINoiseReduction,
CIZoomBlur
)*/
上面 filters 打印出来的字符串就是各种不同的滤镜效果,再通过查看滤镜的属性来了解它的用法。以高斯模糊为例:
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
NSLog(@"attributes: %@", filter.attributes);
/*
打印结果:
attributes: {
"CIAttributeFilterAvailable_Mac" = "10.4";
"CIAttributeFilterAvailable_iOS" = 6;
CIAttributeFilterCategories = (
CICategoryBlur,
CICategoryStillImage,
CICategoryVideo,
CICategoryBuiltIn
);
CIAttributeFilterDisplayName = "Gaussian Blur";
CIAttributeFilterName = CIGaussianBlur;
CIAttributeReferenceDocumentation = "http://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIGaussianBlur";
inputImage = {
CIAttributeClass = CIImage;
CIAttributeDescription = "The image to use as an input image. For filters that also use a background image, this is the foreground image.";
CIAttributeDisplayName = Image;
CIAttributeType = CIAttributeTypeImage;
};
inputRadius = {
CIAttributeClass = NSNumber;
CIAttributeDefault = 10;
CIAttributeDescription = "The radius determines how many pixels are used to create the blur. The larger the radius, the blurrier the result.";
CIAttributeDisplayName = Radius;
CIAttributeIdentity = 0;
CIAttributeMin = 0;
CIAttributeSliderMax = 100;
CIAttributeSliderMin = 0;
CIAttributeType = CIAttributeTypeScalar;
};
}
*/
属性说明:
CIAttributeFilterAvailable_Mac:最低支持的 Mac 系统版本
CIAttributeFilterAvailable_iOS:最低支持的 iOS 系统版本
CIAttributeFilterCategories:效果所属的分类
CIAttributeFilterDisplayName:效果所显示的名称
CIAttributeFilterName:效果名字
CIAttributeReferenceDocumentation:效果文档地址
inputImage:输入图像属性说明(CIImage 对象)
inputRadius:输入模糊半径属性说明(NSNumber 对象)。默认模糊度为10,最低为0,最高为100。
五、CIContext 对象
在 iOS 平台下创建 CIContext 的方式有多种,比较常用的有两种
- 创建基于 GPU 的 CIContext 对象
CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer: @(YES)}];
- 创建基于 GPU 的 CIContext 对象
CIContext *context = [CIContext contextWithOptions:nil];
注意:
采用基于 GPU 的 CIContext 将可以获得更好的性能,但是基于 GPU 创建的 CIContext 跨应用使用时,会自动降为基于 CPU 的。比如:在进入相册选择相片的时候,如果在 UIImagePickerControllerDelegate 的代理方法中使用 CIContext 对象处理图像,系统就会把这个任务交给 CPU 做。
参考链接
- Core Image 你需要了解的那些事~
- Core Image 介绍
- Filterpedia