要使用 Core Image,你必须创建一个 CIFilter
实例,设置适当的键值,然后获取过滤器的输出图像。
let inImg = CIImage(CGImage:someUIImage.CGImage!)
let filter = CIFilter(name:"CIGaussianBlur", withInputParameters:[kCIInputRadiusKey: 100.0, kCIInputImageKey: inImg])
let outImg = filter.outputImage
这需要做很多工作才能调用一个函数,并且随着你链式连接的滤镜越来越多,这个过程变得越来越繁琐。CIFilterKit 提供了一个功能化、可组合的包装器,可以使 Core Image 更容易使用。
安装 CIFilterKit 最简单的方法是使用 CocoaPods。只需将以下内容添加到您的 Podfile 中
pod 'CIFilterKit'
注意,如果您尚未添加,请将 use_frameworks!
添加到您的 Podfile 中。
Filter
是一个类型为 CIImage -> CIImage
的函数。您可以调用相应的函数创建任何可用 Core Image 滤镜的实例,其名称相当于 CIFilter
(去掉“CI”)。例如,介绍中的代码变为:
let outImg = GaussianBlur(100.0)(inImg)
许多滤镜接受一个关联的 options
结构体作为参数。每个实现两个初始化器 - 一个接受结构体中每个变量的参数,另一个不接受任何参数,将它们都设置为默认值。后者提供了一种轻松设置单个值并保留其他所有默认值的方法,无需处理可选值。
let options1 = DotScreenOptions(inputCenter:XYPosition(x:150.0, y:150.0), inputAngle:1.6, inputWidth:6.0, inputSharpness:0.7)
var options2 = DotScreenOptions()
options2.inputAngle = 1.6
可以采用 |>>
操作符将过滤器链接在一起。
let inImg = CIImage(CGImage:someUIImage.CGImage!)
let filter1 = GaussianBlur(100.0)
let filter2 = PhotoEffectChrome()
let filter3 = ColorPosterize(50.0)
let stacked: Filter = filter1 |>> filter2 |>> filter3
let outImg = stacked(inImg)
我们可以通过调用 attributesForFilter
获取与过滤器关联的 attributes
字典。
let dotScreenAttributes: FilterAttributes = attributesForFilter(FilterName.DotScreen)
最后,属于 CICategoryGenerator
或 CICategoryGradient
的 CIFilters 不接受输入图像作为参数,因此相应的函数简单地返回输出 CIImage
而不是一个 Filter
闭包。
let aGradient: CIImage = GaussianGradient(GaussianGradientOptions())
受Chris Eidhof、Florian Kugler和Wouter Swierstra所著的《Swift函数式编程》一书中“包装核心图像”章节的启发。