简介
Core Image 是一种图像处理和分析技术,可为静态和视频图像提供高性能处理。 使用许多内置图像过滤器来处理图像并通过链接过滤器来构建复杂效果。
关于过滤器种类和效果可以查看官方文档:Core Image Filter Reference。
系统内置了多种滤镜效果,你可以将多种滤镜组合使用,一般情况下的需求都可以满足。当然,你也可以自定义滤镜效果。
关于自定义了滤镜可以查看官方文档:Core Image Programming Guide。
基础知识
三个重要的类
Core Image 中的图像类,类似 UIKit 中的 UIImage 类。
Core Image 中的图像过滤器,可以使用它来处理一个或者多个图像,并产生新的图像数据。
Core Image 中处理图像的上下文,可以用来渲染、分析图像。
CIContext 和 CIImage 对象是不可变的,因此多个线程可以使用同一个 CIContext 对象来呈现 CIImage 对象。但是,CIFilter 对象是可变的,因此无法在线程之间安全地共享,每个线程必须创建自己的 CIFilter 对象。
应用在过滤器中的参数类型
- CIColor
定义了特定颜色空间。
- CIVector
坐标值,方向矢量,矩阵和其他非标量值的容器,用于 Core Image 中的过滤器参数。
- CIFilterShape
过滤器的边界形状和过滤操作的定义域的描述。
- CIFormat
图像输入,输出和处理的像素数据格式。
内置过滤器的使用示例
上图使用了三种过滤器组合起来实现效果:
1、使用 sepia 对带有红褐色色调的图像进行着色
2、添加 bloom 滤镜以突出显示高光
3、使用 Lanczos 比例滤镜缩小图像
接下来我们来演示一下滤镜的使用步骤。
步骤一:上下文和资源图像
- 上下文
正像我们之前提到的,我们需要一块处理图像的上下文:CIContext ,创建该对象是非常消耗资源的,因此我们可以在应用的整个生命周期中一直持有该对象重复使用。
let context = CIContext()
- 图像
巧妇难为无米之炊,我们还需要提供被处理的图像资源:CIImage ,该对象本身是不可显示的,你可以将其转换为 UIImage 进行显示,或者将 UIImage 转为 CIImage 对象。
let imageURL = URL(fileURLWithPath: "\(Bundle.main.bundlePath)/YourImageName.png")
// CIImage 对象
let originalCIImage = CIImage(contentsOf: imageURL)!
// 转换为 UIImage 对象显示
self.imageView.image = UIImage(ciImage:originalCIImage)
步骤二:选择内置过滤器
内置过滤器是不可见属性的类型,我们可以使用 KVC 的形式提前给过滤器设置过滤器的相关属性,也可以在创建过滤器时指定。如果你不知道有哪些过滤器,可以查询官方文档:Core Image Filter Reference。
- 使用 Sepia 过滤器
系统提供了一些常见的和参数相关的key,例如 kCIInputImageKey
、kCIInputRadiusKey
等,如果你无法推断关联的 key,则只需使用过滤器对应参数的字符串即可。例如上图中的 inputImage
就表示 <