现在我们已经定义了 Filter 类型,接着就可以开始定义函数来构建特定的滤镜了。这些函数在接受特定滤镜所需要的参数之后,构造并返回一个 Filter 类型的值。它们的基本形态大概都是下面这样:
让我们来定义第一个简单的滤镜——高斯模糊滤镜。定义它只需要模糊半径这一个参数:
一切就是这么简单。 blur 函数返回一个新函数,新函数接受一个 CIImage 类型的参数 image ,并返回一个新图像( return filter.outputImage )。因此, blur 函数的返回值满足我们之前定义的 CIImage-> CIImage ,也就是 Filter 类型。
这个例子仅仅只是对Core Image中一个已经存在的滤镜进行的简单封装。我们可以反复使用相同的模式来创建自己的滤镜函数。
现在让我们来定义一个能够在图像上覆盖纯色叠层的滤镜。Core Image默认不包含这样一个滤镜,但是我们完全可以用已经存在的滤镜来组成它。
我们将使用的两个基础组件:颜色生成滤镜( CIConstantColorGenerator )和图像覆盖合成滤镜( CISourceOverCompositing )。首先让我们来定义一个生成固定颜色的滤镜:
这段代码看起来和我们用来定义模糊滤镜的代码非常相似,但是有一个显著的区别:颜色生成滤镜不检查输入图像。因此,我们不需要给返回函数中的图像参数命名。取而代之,我们使用一个匿名参数 _ 来强调滤镜的输入图像参数是被忽略的。
接下来,我们将要定义合成滤镜:
在这里我们将输出图像剪裁为与输入图像一致的尺寸。严格来说,这不是必需的,而完全取决于我们希望滤镜如何工作。不过,这个选择在我们即将涉及的例子中效果很好。
最后,我们通过结合两个滤镜来创建颜色叠层滤镜:
我们再次返回了一个接受图像作为参数的函数。 colorOverlay 函数首先调用了 colorGenerator 滤镜。 colorGenerator 滤镜需要一个 color 作为参数,然后返回一个新的滤镜,因此代码片段colorGenerator(color)是Filter类型。而Filter类型本身就是一个从CIImage到CIImage的函数;因此我们可以向colorGenerator(color)函数传递一个 附加 的CIImage类型的参数,最终我们能够得到一个CIImage类型的新叠层。这就是我们在定义overlay的过程中所发生的全部事情,可以大致概括为——首先使用colorGenerator函数创建一个滤镜,接着向这个滤镜传递一个image参数来创建新图像。与之类似,返回值compositeSourceOver(overlay)(image)由一个通过compositeSourceOver(overlay)函数构建的滤镜和随即被作为参数的image组成。