前言
本文读者应该已经掌握了CoreImage基本用法,能够简单使用CIFilter并能够用CIContext渲染输出图片。
本文不会主要讲述如何使用CoreImage,如果对于CoreImage还不太熟悉,请前往苹果官方文档查看并学习:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/CoreImaging/CoreImage.pdf
开始
在我们开始实现之前,我们最好先把整个思路设计一下,就像软件工程里面的概要设计和详细设计一样,它能有效的帮助我们理清思路,找到问题的解决方案,为我们的实现打下良好的基础
设计
实现之前必先设计
自iOS5以后,图像处理应用大量兴起,主要是由于CoreImage的出现。CI框架提供了大量的built in滤镜供开发者们使用,并且使用起来异常简单。而CI的built in滤镜有一个非常强大的高可扩展性设计:我们可以通过子类化一个CIFilter自定义自己的滤镜效果。
在苹果的官方文档中提到,如果built in滤镜无法满足开发的需求,比如开发者们需要将多个滤镜组成一个滤镜链用来处理图片,而这个滤镜链会被多次使用,这时我们就可以将这个滤镜链通过子类化CIFIlter来封装成一个我们自己的filter对象。
如何实现自己想要的滤镜效果呢?首先我们要知道多个滤镜组合起来对一张图片进行处理后的效果是怎样的。
用 Quartz Composer,来做 Core Image 滤镜图表的原型非常有用,可以从 苹果官方网站上面下载
对于一些特殊的滤镜效果,在built in中没有的,而在ps中大家经常遇到的效果,比如今天我们要实现的素描效果的滤镜,大家可以上搜索网站进行搜索,找到这个滤镜效果的实现流程,比如素描滤镜的实现:
1、去色;
2、复制去色图层,并且反色;
3、对反色图像进行高斯模糊;
4、模糊后的图像叠加模式选择颜色减淡效果。
好了,到这一步,我们的设计思路已经出来了:
1、去网上搜索素描滤镜的实现流程;
2、使用滤镜链对图片进行处理以验证该流程的准确性;
3、子类化一个CIFilter将该流程封装成一个单滤镜效果。
第一步实际上是比较灵活的,我们既可以使用Quatz Composer来试验(如果你有图像处理或者PS比较不错的经验的话,应该能很快找到相应的滤镜链)使用哪几个个滤镜组成的滤镜链能够达到自己想要的效果;我们也可以像我写的这样,直接去网上搜索某个效果的滤镜实现。
最后针对设计的每一步再详细的进行具体的设计:
1、首先我们要知道素描滤镜的滤镜链是怎样串联起来的 。
这个问题可以在网上进行搜索,我们可以创建一个
去色->反色->高斯模糊->颜色减淡叠加
的滤镜链,而在去色后需要拷贝一次图像,用拷贝的图像来继续下面的滤镜操作。
2、然后我们需要知道如何实现滤镜链。
在官方文档中进行了描述:
You can create amazing effects by chaining filters—that is, using the output image from one filter as input to another filter.
简单的说,就是把一个滤镜的输出图片作为下一个滤镜的输入图片
3、如何通过子类化一个CIFilter来封装一个滤镜链的效果
这个问题同样在官方文档中有具体的流程:
To subclass a filter you need to perform the following tasks:
- Declare