开始之前,让我们谈谈Core Image框架中最重要的几个类:
- CIContext. 所有图像处理都是在一个CIContext 中完成的,这很像是一个Core Image处理器或是OpenGL的上下文。
- CIImage. 这个类保存图像数据。它可以从UIImage、图像文件、或者是像素数据中构造出来。
- CIFilter. 滤镜类包含一个字典结构,对各种滤镜定义了属于他们各自的属性。滤镜有很多种,比如鲜艳程度滤镜,色彩反转滤镜,剪裁滤镜等等。
基本的图像滤镜
作为第一个尝试,我们先简单的让图像通过一个CIFilter 之后显示在屏幕上。每一次当我们想应用一个CIFilter的时候都要有以下四个步骤:
- 创建一个 CIImage 对象: CIImage 有如下的初始化方法: imageWithURL:, imageWithData:, imageWithCVPixelBuffer:, 和 imageWithBitmapData:bytesPerRow:size:format:colorSpace:。但是大多数时候你只会经常用到imageWithURL。
- 创建一个 CIContext: 一个 CIContext 可以是基于CPU或是GPU的。它可以被重用,所以你不用每次都创建一个。但是当输出CIImage对象的时候你至少一定会需要一个CIContext。
- 创建一个CIFilter: 当你创建滤镜的时候,你可以在上面配置一定数量的属性。具体的属性取决于你所要用的滤镜。
- 输出滤镜:这个滤镜会输出一个图像成为CIImage。 你可以用CIContext把它转化为一个UIImage 。
CIContext *context = [CIContext contextWithOptions:nil];//上下文
CIImage *cImage = [CIImage imageWithCGImage:[imageView.image CGImage]];//保存图像数据
CIFilter *invert = [CIFilter filterWithName:@"CIColorInvert"];//创建滤镜对象,还可以使用filterWithName:keysAndValue:在创建的同时设置参数
CIFilter *invert = [CIFilter filterWithName:@"CIColorInvert" keysAndValue:@"inputImage", cImage, nil ];
[invert setDefaults];//设置滤镜的默认参数,将全部参数设置为默认值
[invert setValue:cImage forKey:@"inputImage"];//设置输入参数,是必须要设定的参数
CIImage *result = [invert valueForKey:@"outputImage"];//获得输出的CIImage图像对象,可以调用滤镜的outputImage方法获得图像输出对象
CIImage *result = [invert outputImage];
例如:
CIImage *ciImage = [[CIImage alloc] initWithImage:orgImage];
CIFilter *filter = [CIFilter filterWithName:items[row]
keysAndValues:kCIInputImageKey, ciImage, nil];
[filter setDefaults];
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *outputImage = [filter outputImage];
CGImageRef cgImage = [context createCGImage:outputImage
fromRect:[outputImage extent]];
imageView.image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);