参考网址:http://blog.sina.com.cn/s/blog_92ac2c5b0101cm5b.html
感谢 出其东门

做过 iOS 开发的人,对core这个字眼一定不陌生,它总是代表着或者底层的,或者牛叉的,或者底层牛叉的Apple 自己的框架.

CoreImage 让你可以简单的应用滤镜来处理图片,比如修改饱和度,亮度,对比度等东西(对了解 PS 的人来说,非常的亲切吧).

它利用GPU(或者CPU,取决于客户)来非常快速、甚至实时地处理图像数据和视频的帧。多个Core Image滤镜可以叠加在一起,从而可以一次性地产生多重滤镜效果。

Mac上只有一部分Core Image滤镜可以在iOS上使用。但是随着这些可使用滤镜的数目越来越多,API可以用来发现新的滤镜属性。

我们可以使用如下代码来打印支持的滤镜:

 NSArray *filters = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];NSLog(@"%@", filters); [filters count];NSLog(@"一共有 %d 种 CIFilter 滤镜效果", [filters count]);

我的输出是: 127种

CoreImage 的概览
开始之前,让我们谈谈Core Image框架中最重要的几个类:

  • CIContext. 所有图像处理都是在一个CIContext 中完成的,这很像是一个Core Image处理器或是OpenGL的上下文。
  • CIImage. 这个类保存图像数据。它可以从UIImage、图像文件、或者是像素数据中构造出来。
  • CIFilter. 滤镜类包含一个字典结构,对各种滤镜定义了属于他们各自的属性。滤镜有很多种,比如鲜艳程度滤镜,色彩反转滤镜,剪裁滤镜等等。

基本的图像滤镜

作为第一个尝试,我们先简单的让图像通过一个CIFilter 之后显示在屏幕上。每一次当我们想应用一个CIFilter的时候都要有以下四个步骤:

  1. 创建一个 CIImage 对象: CIImage 有如下的初始化方法: imageWithURL:imageWithData:imageWithCVPixelBuffer:, 和 imageWithBitmapData:bytesPerRow:size:format:colorSpace:。但是大多数时候你只会经常用到imageWithURL

  2. 创建一个 CIContext: 一个 CIContext 可以是基于CPU或是GPU的。它可以被重用,所以你不用每次都创建一个。但是当输出CIImage对象的时候你至少一定会需要一个CIContext。

  3. 创建一个CIFilter: 当你创建滤镜的时候,你可以在上面配置一定数量的属性。具体的属性取决于你所要用的滤镜。

  4. 输出滤镜:这个滤镜会输出一个图像成为CIImage。 你可以用CIContext把它转化为一个UIImage ,具体过程如下。

// 1
NSString *filePath =[[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"];
NSURL *fileNameAndPath = [NSURL fileURLWithPath:filePath];// 2
CIImage *beginImage =[CIImage imageWithContentsOfURL:fileNameAndPath];// 3
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"keysAndValues: kCIInputImageKey, beginImage,@"inputIntensity", @0.8, nil];
CIImage *outputImage = [filter outputImage];// 4
UIImage *newImage = [UIImage imageWithCIImage:outputImage];
self.imageView.image = newImage;

让我们依次看看这些代码都做了什么事情

  1. 前两行创建了一个NSURL 对象, 包含指向图形文件的路径。
  2. 下面,用imageWithContentsOfURL方法创建CIImage。
  3. 之后,创建CIFilter对象。一个 CIFilter 构造函数有两个输入,分别是滤镜的名字,还有规定了滤镜属性的键值和取值的字典。 每一个滤镜会有它自己唯一的键值和一组有效的取值。CISepiaTone 滤镜只能选两个值: KCIInputImageKey (一个CIImage) 和 @”inputIntensity”。 后者是一个封装成NSNumber (用新的文字型语法)的浮点小数,取值在0和1 之间。大部分的滤镜有默认值,只有CIImage是个例外。你必须提供一个值给它,因为它没有默认值。从滤镜中导出CIImage很简单,只需要用outputImage方法。
  4. 一旦你有了导出的 CIImage,你就可以把它转化为一个 UIImage。 在新的iOS6中,UIImage 方法+ imageWithCIImage方法可以实现从CIImage 到UIImage 到转化。一旦转化完成,我们就可以让UIImage 显示在之前添加的图像视图里。

原图:

效果图:

把它放在上下文中

在进行下一步之前,有一个优化的方法很实用。我前面提到过,你需要一个CIContext来进行CIFilter,但是在上面的例子中我们没有提到这个对象。因为我们调用的UIImage方法(imageWithCIImage)已经自动地为我们完成了这个步骤。它生成了一个CIContext并且用它来处理图像的过滤。这使得调用Core Image的接口变得很简单。

但是,有一个主要的问题是,它的每次调用都会生成一个CIContext。CIContext本来是可以重用以便提高性能和效率的。比如下面我们要谈到的例子,如果你想用滑动条来选择过滤参数取值,每次改变滤镜参数都会自动生成一个CIContext, 使得性能非常差。

让我们想个好办法搞定这个问题。删除你之前添加到viewDidLoad里面的代码,用下面的代码取而代之:

CIImage *beginImage =[CIImage imageWithContentsOfURL:fileNameAndPath];// 1
CIContext *context = [CIContext contextWithOptions:nil];CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"keysAndValues: kCIInputImageKey, beginImage,@"inputIntensity", @0.8, nil];
CIImage *outputImage = [filter outputImage];// 2
CGImageRef cgimg =[context createCGImage:outputImage fromRect:[outputImage extent]];// 3
UIImage *newImage = [UIImage imageWithCGImage:cgimg];
self.imageView.image = newImage;// 4
CGImageRelease(cgimg);

再让我逐步解释一下这部分代码

  1. 在这部分代码中,你创建了CIContext对象。CIContext 构造函数的输入是一个NSDictionary。 它规定了各种选项,包括颜色格式以及内容是否应该运行在CPU或是GPU上。对于这个应用程序,默认值是可以用的。所以你只需要传入nil作为参数就好了。
  2. 在这里你用上下文对象里的一个方法来画一个CGImage。 调用上下文中的createCGImage:fromRect:和提供的CIImage可以生成一个CGImageRef。
  3. 下面,你用UIImage + imageWithCGImage,从CGImage中创建一个UIImage。
  4. 最后,开放 CGImageRef接口。 CGImage 是一个C接口,即使有ARC,也需要你自己来做内存管理。

    编译运行,确保正常工作。

在这个例子中,添加CIContext的创建 和你自己来创建的区别不大。但是,在动态改变滤镜参数的时候的时候,能看出重大性能差别。

CoreImage 及滤镜效果相关推荐

  1. iOS框架介绍之coreImage

    1.coreImage的介绍 coreImage是IOS5中新加入的一个Objective-c的框架,提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析.IOS提供了很多强大的滤镜(Fi ...

  2. 使用CoreImage教程

    使用CoreImage教程 CoreImage包含有很多实用的滤镜,专业处理图片的库,为了能看到各种渲染效果,请使用如下图片素材. 现在可以开始教程了: #define FIX_IMAGE(image ...

  3. iOS CoreImage之滤镜简单使用

    代码地址如下: http://www.demodashi.com/demo/11605.html 老骥伏枥,志在千里 前记 最近一直在研究图像处理方面,既上一篇iOS Quart2D绘图之UIImag ...

  4. Metal每日分享,调整胶片颗粒感滤镜效果

    本案例的目的是理解如何用Metal实现调节胶片颗粒感滤镜,通过调整颗粒参数来调整晶粒尺寸来达到颗粒感效果: Demo HarbethDemo地址 实操代码 // 调节胶片颗粒感滤镜 let filte ...

  5. Metal每日分享,图像阀值素描滤镜效果

    本案例的目的是理解如何用Metal实现图像阀值素描滤镜,用于图像阀值素描,形成有噪点的素描: Demo HarbethDemo地址 实操代码 // 用于图像阀值素描,形成有噪点的素描 let filt ...

  6. 使用CoreImage实现素描滤镜

    前言 开始 设计 实现 封装 总结 hint 前言 本文读者应该已经掌握了CoreImage基本用法,能够简单使用CIFilter并能够用CIContext渲染输出图片. 本文不会主要讲述如何使用Co ...

  7. Metal每日分享,纯色图片滤镜效果

    本案例的目的是理解如何用Metal实现纯色图片效果滤镜,主要就是生成纯色图片: Demo HarbethDemo地址 实操代码 // 纯色滤镜 ImageView.image = C7Color.pu ...

  8. Metal每日分享,自然饱和度滤镜效果

    本案例的目的是理解如何用Metal实现自然饱和度效果滤镜,简单讲就是调整图像整体的明亮程度,如调节到较高数值,图像会产生色彩过饱和从而引起图像失真: Demo HarbethDemo地址 iDay每日 ...

  9. Metal每日分享,颜色转换滤镜效果

    本案例的目的是理解如何用Metal实现像素颜色转换滤镜,通过对像素颜色的不同读取方式获取到相应像素颜色,灰度图移除场景中除了黑白灰以外所有的颜色,让整个图像灰度化: Demo HarbethDemo地 ...

最新文章

  1. usaco Overfencing 穿越栅栏(BFS)
  2. jquery 读秒,倒数计时方案
  3. css3 box-sizing:border-box 实现div一行多列
  4. 关于系统弹出错误:429 , ActiveX 部件不能创建对象 的解决方法
  5. Sizzle 官方API翻译
  6. Linux环境搭建 手把手教你配置Linux虚拟机
  7. 将VC++6.0的代码迁移到VS2005常见问题总结(Window核心编程第五版以前代码在VS2005无法编译的解决方案)...
  8. python数字转中文字符_Python实现中文数字转换为阿拉伯数字的方法示例
  9. unity底层运行机制_Unity跨平台的机制原理
  10. n型半导体和p型半导体的区别_PNP和NPN的区别和判别方法,网友:太厉害了!终于有人能讲明白了...
  11. X86 register
  12. 谷歌Linux基金会等联合推出开源软件签名服务 sigstore,提振软件供应链安全
  13. 计算机工程制图cad,物流工程制图CAD计算机绘图指导教程
  14. 谢菲尔德大学的MATLAB遗传算法工具箱(附代码文件)
  15. 虚拟机centos7无法正常启动
  16. Java写一个矩阵输出并输出它的转置
  17. 有关Windows10中诊断和反馈隐私设置
  18. 空分多址——SDMA
  19. 一看就会QuickWAP入门(转)
  20. Plateaus-adventure

热门文章

  1. ffmpeg视频蒙版,在文字里显示视频
  2. GRUB2的配置方法【涉及/etc/default/grub,/etc/grub.d/*】
  3. mysql web工具下载_Webcat
  4. android 霓虹灯制作
  5. 辅助外挂-微信跳一跳
  6. 取消html里字体自带的行间距
  7. Unity递归遍历给定物体的所有子物体
  8. clickhouse设置加密用户名密码
  9. APNs入门学习和使用
  10. 1.探花交友项目环境搭建