购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 组合滤镜

到现在为止,我们已经定义了模糊滤镜和颜色叠层滤镜,可以把它们组合在一起使用:首先将图像模糊,然后再覆盖上一层红色叠层。让我们来载入一张图片试试看:

现在我们可以链式地将两个滤镜应用到载入的图像上:

我们再一次通过创建滤镜来处理图像,例如先创建了 blur(blurRadius) 滤镜,然后将其运用到图像上。

复合函数

当然,我们可以将上面代码里两个调用滤镜的表达式简单合为一体:

然而,由于括号错综复杂,这些代码很快失去了可读性。更好的解决方式是自定义一个运算符来组合滤镜。为了定义该运算符,首先我们要定义一个用于组合滤镜的函数:

composeFilters 函数接受两个Filter类型的参数,并返回一个新定义的滤镜。这个复合滤镜接受一个CIImage类型的图像参数,然后将该参数传递给filter1,取得返回值之后再传递给filter2。我们可以使用复合函数来定义复合滤镜,就像下面这样:

为了让代码更具可读性,我们可以再进一步,为组合滤镜引入运算符。诚然,随意自定义运算符并不一定对提升代码的可读性有帮助。不过,在图像处理库中,滤镜的组合是一个反复被讨论的问题,所以引入运算符极有意义:

与之前使用 composeFilters 的方法相同,现在我们可以使用 >>> 运算符达到目的:

由于已经定义的运算符 >>> 是左结合的(lef-associative),就像Unix的管道一样,滤镜将以从左到右的顺序被应用到图像上。

我们定义的组合滤镜运算符是一个 复合函数 的例子。在数学中, f g 两个函数构成的复合函数有时候被写作 f · g ,表示定义的新函数将输入的 x 映射到 f(g(x)) 。除了顺序,这恰恰也是我们的 >>> 运算符所做的:将一个图像参数传递给运算符操作的两个滤镜。 9fnxeMZefoSx9HtxAwsPCunRql9om+KMad2k9u1fjDpC+w0g6Ms6P8MJr4Q4ol/m

点击中间区域
呼出菜单
上一章
目录
下一章
×