概述:git
CoreImage是一个图像框架,它基于OpenGL顶层建立,底层则用着色器来处理图像,这意味着它利用了GPU基于硬件加速来处理图像。CoreImage中有不少滤镜,它们可以一次给予一张图像或者视频帧多种视觉效果。并且滤镜能够链接起来组成一个滤镜链,把滤镜效果叠加起来处理图像。github
CoreImage框架最先出现于iOS5,iOS6也对这个框架进行了扩展,这篇博客的Demo是基于iOS7的。app
CoreImage框架最经常使用的类:框架
* CIImage工具
保存图像数据的类,能够经过UIImage,图像文件或者像素数据来建立,包括未处理的像素数据如:性能
- imageWithCVPixelBuffer:spa
- imageWithData:.net
方法等等。3d
也能够经过图像数据类好比UIImage,CGImageRef等等。orm
* CIFilter
滤镜类,这个框架中对图片属性进行细节处理的类。它对全部的像素进行操做,用一些键-值设置来决定具体操做的程度。
* CIContext
上下文类,如CoreGraphics以及CoreData中的上下文用于处理绘制渲染以及处理托管对象同样,CoreImage的上下文也是实现对图像处理的具体对象。
这里须要注意的是在Context建立的时候,咱们须要给它设定为是基于GPU仍是CPU。(这里使用GPU)
基于GPU的话,处理速度更快,由于利用了GPU硬件的并行优点。可是GPU受限于硬件纹理尺寸,并且若是你的程序在后台继续处理和保存图片的话,那么须要使用CPU,由于当app切换到后台状态时GPU处理会被打断。
简单使用:
简介完三个类以后,介绍下简单使用步骤:
实例化一个CIImage,
建立一个你须要的CIFilter滤镜并给滤镜设置属性,
建立CIContext上下文来初始化一个CGImageRef对象,
再将其赋给UIImage对象进行显示。
这篇文章采用工具类的方法来进行滤镜处理。
下面是一个简单的棕色滤镜的使用:
传入一个图片的path,生成CIImage对象,而后经过SepiaTone滤镜通过处理,强度自定义便可(范围:0~1之间)。
UIImage不是有个类方法直接经过CIImage对象生成UIImage吗?可是那样每一次都要建立一个CIContext对象,对于频繁调用时会很消耗性能。
因此,这里的context在工具类初始化的时候已经初始化了。
这里使用GPU来进行图片渲染的处理。上面已经提到过,这样速度会更快些。
若是想用CPU,则能够调用[CIContext contextWithOptions:]传入一个字典,将CPU做为渲染键值。
工具类里提供了4个方法可以快速的使用该滤镜渲染。
下面继续介绍其余的滤镜
仿射变换滤镜
仍是经过两种传入途径,一个路径,一个图片
如今咱们已经使用了两个滤镜。那么可不能够把两个滤镜连起来用呢?
答案是能够的,这就是通常所说的滤镜链,咱们能够得到上一个滤镜的输出图片做为下一个滤镜的输入,而后进行渲染处理,而处理的次数怎么处理则咱们由咱们本身需求而随意更改。
因而我把上面两个滤镜链接起来使用。
CIImage *ciimg = [_tool transOutputWithPath:path transform:CGAffineTransformMakeRotation(M_PI)];
_image = [_tool sepiaImageWithCIImage:ciimg intensity:1.0];
_imageView.image = _image;
通过两个工具方法处理后,咱们获得了通过滤镜链处理的图像,以下:
混合滤镜
若是你的图片的透明通道为YES想在下方添加一个底层的图片的话,能够用CISourceAtopCompositing滤镜。
拉直滤镜
若是你的图片因为拍摄时稍微倾斜或者抖动,可使用这个滤镜并传入一个旋转角度参数来修正图片。
色彩控制滤镜
能够传入颜色的亮度,对比度和饱和度来给图片过滤。
反转颜色滤镜
给图片使用反色。
面部检测初步
CoreImage类中提供了一个CIDectetor类来给咱们提供两种类型的检测器。
其中一种便是面部检测。
建立检测器时传入Type参数指定为面部便可,options中能够传入一个检测精度。
下面是返回图片中全部左眼位置、右眼位置以及嘴部位置的方法。
左眼:
右眼:
嘴部:
这篇博客介绍了CoreImage出现以来最基本的几个滤镜。
以后会对这个滤镜处理工具继续进行扩充。
Demo下载
CSDN资源:点击打开连接
GitHub仓库:点击打开连接
以上就是本篇博客的所有内容,欢迎指正和交流~转载注明出处~