See also
Core Image Referece Collection
Core Image Fileter Referece
Core Image Kernel Language Reference
1、图像处理
Core Image有三个类处理图片
a、 CIFilter:可变的用来描述一个结果,一个滤镜对象至少一个输入参数和一个输出图片
b、 CIImage:一个用来描述一张图片的不可变对象,可以分析一个来自文件或者CIFilter输出对象的数据
c、 CIContext:用来给Core Image画滤镜对象产生的结果的一个对象,一个CI上下文对象能基于cpu或gpu
总之,通过上面这三个类处理图片是本章的主要内容
2、总揽
如需使用Core Image需在项目工程里面添加CoreImage.framework(QuartzCore.framework on OS X)并且在资源文件中引入头文件(<CoreImage/CoreImage.h> iOS or <QuartzCore/CoreImage.h> on OS X)
例子代码:
CIContext *context = [CIContent contextWithOptions:nil];//创建一个CIContext对象
CIImage *image = [CIImage imageWithContentsOfURL:myURL];//创建一个CIImage对象
CIFilter *filter = [CIFilter filterWithName:@“CISepiaTone”];//创建一个CIFilter对象
[filter setValue:image forKey:kCIInputImageKey];
[filter setValue:@0.8 forKey:kCIInputIntensityKey];
CIImage *result = [filter valueForKey:kCIOutputImageKey];//获得输出图片
CGRect extent = [result extent];
CGImageRef cgImage = [context createCGImage:result fromRect:extent];//渲染这个CIImage到Core Graphics图片用来展示或者保存
有一些Core Image filter产生的图片是无限大的,例如这个CICategoryTileEffect 类别,渲染前,这个无限大的图片必须被剪裁(CICrop filter)或者必须指定一个有限矩形来渲染这个图片
3、CIContext
a、contextWithOption:
此方法将由cpu还是gpu渲染取决于option后字典参数kCIContextUseSoftwareRenderer,如果为@YES则由gpu渲染,速度比cpu渲染更快,等要显示的时候再转换成其他图片类型,如UIImage并拷贝到cpu内存。
b、 contextWithEAGLContext: options:
当需要实时展示的时候建议用此方法,该方法比起a方法的优势在于渲染图片一直在gpu并且从来不会拷贝到cpu内存,不过首先得创建一个EAGL上下文:
EAGLContext *myEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
使用此方法时最好将颜色管理器关闭,也就是将color space置为null,因为颜色管理将降低性能,一般实时显示app需要将此关闭,这并不会对我们程序造成很大的影响
NSDictionary *options = @{ kCIContextWorkingColorSpace : [NSNull null]};
CIContext *myContext = [CIContext contextWithEAGLContext : myEAGLContext options :options];
4、CIImage
Core Image Filter处理Core Image对象,CIImage对象实际上是一个图像的食谱,CoreImage在没有渲染之前不会产生任何像素。
初始化方法:
imageWithContentsOfURL: (options:)
imageWithCGImage: (options:)
imageWithBitmapata: bytesPerRow: size: format: colorSpace:
imageWithImageProvider: size: format: colorSpace: op