Core Image 滤镜是 iOS 5 的新增框架,通过使用这个框架,程序可以非常容易地对图片进行各种特效处理,包括色彩调节、降噪、扭曲等。简单来说,Core Image 滤镜完全可以与 Photoshop 滤镜媲美。
Core Image 的三个核心API
-
CIContext:
它是 Core Image 处理的核心 API,所有图片的处理都在它的管理下完成。 -
CIFilter:
它代表过滤器。所有的过滤器都由该 CIFilter 代表,在创建 CIFilter 时传入不同的参数即可创建不同类型的过滤器。 -
ClImage:
它代表 Core Image 过滤器处理的图片,CIFilter 过滤器的输入图片、输出图片都由该 ClImage 代表。程序可通过 UlImage、图片文件或像素数据来创建 CIImage。
1. 创建 CIContext 对象。
在 iOS 平台上有如下三种方式创建 CIContext。
- 第一种方式:创建基于 CPU 的 CIContext 对象。
ctx = [CIContext contextWithOptions: @ {kCIContextUseSoftwareRenderer: [NSNumber numberWithBool: YES] };
- 第二种方式:创建基于 GPU 的 CIContext 对象。
ctx = [CIContext contextWithOptions: nil];
- 第三种方式:创建基于 OpenGL 优化的 CIContext 对象,可获得实时性能。
EAGLContext * eaglctx [[EAGLContext alloc]
initWithAPI: kEAGLRenderingAPIOpenGLES2];
ctx = [CIContext contextWithEAGLContext: eaglctx];
Note
如果使用基于 OpenGL 优化的 CIContext 对象,程序还需要为该应用增力口 OpenGL ES 框架。
采用基于 GPU 的 CIContext 将可以获得更好的性能,因此,一般建议创建基于 GPU 的 CIContext。但基于 GPU 的 CIContext 对象无法跨应用访问。比如,应用打开 UlImagePickerController 选取照片进行美化,如果直接在 UlImagePickerContollerDeleg 的委托方法里调用 CIContext 对象进行处理,那么系统会自动将其降为基于 CPU 的,速度会变慢,因此,建议在委托方法中只把照片保存下来,回到主类里调用 CIContext 进行处理。
2. 创建CIFilter过滤器
创建 CIFilter 过滤器。CIFilter 提供了
filterWithName:
类方法来创建 CIFilter 对象。该方法需要传入过滤器的名字一 Core Image 提供了大量的过滤器,不同的过滤器有不同的名字。需要说明的是,并非该文档中列出的所有过滤器都可在 iOS 平台上使用,有些过滤器只能在 OS X 系统上使用。
Note
除此之外,还可以通过 CIFilter 的 filterNamesInCategory:类方法获取该平台内建支持的所有过滤器,再调用指定 CIFilter 对象的 attributes 实例方法,即可看到该过滤器支持的所有属性。
3. 创建CIImage对象
该CIImage将要作为过滤器处理源图片
4. 调用CIFilter
调用
setValue:beginImage for Key:
做属性赋值
5. 设置CIFilter参数
6. 调用CIFilter outputImage属性
获取处理后的图片,返回CIImage
7. 转换
调用 CIContext 的不同方法将 CIlmage 转换为 CGImageRef,或者将该 CIImage 绘制到指定区域中。
核心代码
// 创建基于 CPU 的 CIContext 对象
_ctx= [CIContext contextwithOptions: @ {kCIContextUseSoftwareRenderer:
[NSNumber numberWithBool: YES];
// 创建基于 GPU 的 CIContext 对象
_ctx= [CIContext contextwithOptions: nil];
// 创建基于 OpenGL 优化的 CIContext 对象
EAGLContext * eaglctx = [[EAGLContext alloc]initWithAPI: kEAGLRenderingAPIOpenGLES2];
_ctx= [CIContext contextWithEAGLContext: eaglctx]; // 根据过滤器名来创建过滤器
_filter1= [CIFilter filterWithName: @"CIPixellate"];
_filter2 = [CIFilter filterWithName: @"CIHueAdjust"];
_filter3 = [CIEilter filterWithName: @"CIBumpDistortion"];
_filter4 = [CIFilter filterWithName: @ "CIGaussianBlur"];
// 设置过滤器参数
[_filter1 setValue: _beginImage forKey: @" inputImage"];
[_filter1 setValue: [CIVector vectorWithX: 150 Y:240]forKey: @ " inputCenter"];
[_filter1 setValue: [NSNumber numberWithFloat: slideValue]forKey: @ " inputScale"];
// 得到过滤器处理后的图片
CIImage* outImage = [_ _filter1 outputImage]; CGImageRef tmp = [_ctx createCGImage: outImagefromRect:[outImage extent]];
// 将处理后的图片转换为 UIImage
resultImage = [UIImage imageWithCGImage: tmp];
CGImageRelease (tmp); // 显示图片
[self. Iv setImage: _ _resultImage];
网友评论