Core Image API架构
Core Image的插件架构允许编写自定义滤镜与系统滤镜集成来扩展功能。Core Image需要context对象来实现。
找可用滤镜
向Core Image的kCICategoryBuiltIn类请求得到滤镜名。或者使用Quartz Composer里的Filter查看并且进行组合查看效果。这个范例也可以查看https://github.com/objcio/issue-21-core-image-explorer。
官方提供的Core Image滤镜的完整列表https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/uid/TP40004346
1 2 3
| let filterNames = CIFilter.filterNamesInCategory(kCICategoryBuiltIn) as [String]
|
创建滤镜
1
| let blurFilter = CIFilter(named:"CIGaussianBlur”) //根据滤镜列表里的滤镜名, 可以创建一个滤镜对象,比如高斯模糊滤镜
|
对滤镜对象设置参数
1 2
| blurFilter.setValue(10.0 forKey:"inputRadius”) //设置模糊滤镜的模糊半径
|
查询滤镜属性
查看滤镜的输入和输出参数可以获取inputKeys和outputKeys数组,通过滤镜提供的attributes字典。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
inputBrightness = {
CIAttributeClass = NSNumber;
CIAttributeDefault = 0;
CIAttributeIdentity = 0;
CIAttributeMin = -1;
CIAttributeSliderMax = 1;
CIAttributeSliderMin = -1;
CIAttributeType = CIAttributeTypeScalar;
};
|
示例创建一个19 世纪锡版照风格图像的滤镜
使用CIColorMonochrome和CIVignette滤镜链起来可以达到这种效果。苹果提供了一个叫做Quartz Composer的工具用来做Core Image滤镜图表的原型。
官方下载地址https://developer.apple.com/downloads/index.action?name=Graphics,试着组合成满意的效果后就可以将其code出来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| let sepiaColor = CIColor(red: 0.76, green: 0.65, blue: 0.54)
let monochromeFilter = CIFilter(name: "CIColorMonochrome",
withInputParameters: ["inputColor" : sepiaColor, "inputIntensity" : 1.0])
monochromeFilter.setValue(inputImage, forKey: "inputImage")
let vignetteFilter = CIFilter(name: "CIVignette",
withInputParameters: ["inputRadius" : 1.75, "inputIntensity" : 1.0])
vignetteFilter.setValue(monochromeFilter.outputImage, forKey: "inputImage")
let outputImage = vignetteFilter.outputImage
|
滤镜要求类型是CIImage
1 2 3 4 5 6 7
| let inputImage = CIImage(image: uiImage)
filter.setValue(inputImage, forKey:"inputImage")
|
滤镜处理生成Output Image
1 2 3 4 5 6 7
| let ciContext = CIContext(options: nil)
let cgImage = ciContext.createCGImage(filter.outputImage, fromRect: inputImage.extent())
let uiImage = UIImage(CGImage: cgImage)
|
使用OpenGL解决性能问题
1 2 3 4 5 6 7
| let eaglContext = EAGLContext(API: .OpenGLES2)
let ciContext = CIContext(EAGLContext: context)
ciContext.drawImage(filter.outputImage, inRect: outputBounds, fromRect: inputBounds)
|