Adobe AfterEffects内置特效Arithmetic程序算法上的理解
在本文中,笔者以AE中的Arithmetic特效为例,试图从“算法”的角度来理解图形图像软件中广泛存在的各种叠加模式。由于水平有限,如有谬误还请各位不吝赐教予以斧正。
Motionworks的Effects A-Z系列视频教程第五集中提到了位于Channel下的Arithmetic特效,这是一个工作在8位颜色位深度下的通道特效,能在图层的Red、Green、Blue三个通道上执行多种数学运算,包括按位运算、加减运算以及逻辑运算等,其包含的选项不多,仅有一个运算类型(Operator)设定、Red、Green、Blue三个通道的数值设定以及一个颜色范围的保护性功能,类似于音频调整中的高切。这个特效的主要作用原理是将设定的Red、Green、Blue三通道的数值按照设定的运算类型(Operator)与分别与作用图层的Red、Green、Blue三通道进行数学运算,其返回值为图层上的最终值。
举个例子,新建一个RGBA颜色阵列为[127,127,127,255]的固态层,这是一个百分之五十灰度的图层,将运算类型(Operator)设定为Add(加)模式,然后将Red通道、Green通道数值均设定为128,Blue通道设定为0,其运算过程应该是这样的[127,127,127,255]+[128,128,0,0],结果为[255,255,127,255],即黄色。
需要注意的是这个特效的几种运算类型:
首先是And、or、Xor三种按位运算:按位与运算、按位或运算以及按位异或运算。按位与运算是双目运算,运算符为”&”,其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。 例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。还是以刚才那个百分之五十灰的固态层为例,其颜色阵列[127,127,127,255]转换为二进制应该是[01111111,01111111,01111111,11111111],设置的通道阵列为[10000000, 10000000,00000000,00000000],进行按位与运算得出的结果应是[00000000,00000000,00000000,00000000],转成十进制则为[0,0,0,0],为黑色;位或运算也是是双目运算,运算符为”|”。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。 例如:9|5可写算式如下: 00001001|00000101 00001101 (十进制为13)可见9|5=13 ;按位异或运算也是双目运算,运算符为“^”。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)。对于按位或运算和按位异或运算在Aftereffects里在通道计算中的应用这里就不一一举例了,各位可以自己去验证。
然后是Add(添加\线性减淡)、Subtract(减去)、Difference(差异)、Multiply(正片叠底)、Scree(滤色)n五种混合模式运算。在Add模式下,最终的返回值为图层原通道值与设定的通道值分别相加,比如,原RGBA通道值阵列为[127,127,127,255],在Arithmetic中设定的通道值阵列为[128,128,0,0],那么分别相加后的结果为[255,255,127,255],值得注意的是,Arithmetic并没有提供对Alpha通道值的设定功能;Subtract正好与Add相反,Add是在原来的通道值上加上我们设定的通道值,Subtract则是在原来的通道值上减去我们设定的通道值(需要注意的是,英文Subtract的含义是“从……减去”,而非“减去(minus)”,理解这一点对于在AE、PS中的各种应用如混合模式、Mask模式等有很大的帮助),在这个模式下假如我们的原通道值阵列为[127,127,127,255],我们设定的通道值为[27,27,0,0],将原来的通道值减去我们设定的通道值[127,127,127,255]- [27,27,0,0]=[100,100,127,255]。
再来谈谈Difference模式,本质上这也是一种相减的算法,不同的是Difference的中相减是双向的,既可以是“minus”,也可以是“Subtract”,至于在运算过程中到底执行哪种减法运算则取决于原通道和设定的通道值的亮度:由亮的值减去暗的值得出最后的返回值,还是以前面的百分之五十灰度的固态层为例,我们知道,这个图层的通道值阵列为[127,127,127,255],在这个图层上我们添加Arithmetic特效,将Arithmetic的运算类型(Operator)设置为“Difference”,然后通道值设定为[154,27,0,0],按照亮的减去暗的这个原则,在红通道上,原图层值为127比我们设定的154要暗,所以这里是由设定的154减去原来的127值为27,在绿通道上,原通道值为127比我们设定的通道值27要亮,所以这里是由原通道值的127减去我们设定的通道值27值为100,B通道和α通道值不变,所以这个运算的返回值为[27,100,127,255]。
和Add与Subtract类似,Multiply和Screen也是一组相反的算法。Multiply(正片叠底)的一般算法是:将原图层各个通道值分别与设定的各个通道值相乘然后在除以255即得出最后的返回值。还是以上面的百分之五十灰度的固态层为例,在其上面添加Arithmetic特效后,我们将运算类型(Operator)设定为Multiply,通道值设定为[128,128,0],需要再次强调的是,在Arithmetic中并没有α通道值的设定功能,因此,其运算过程为{[127,127,127]*[128,128,0]}/255,结果为[63,63,0]。这也就解释了在正片叠底模式下,为什么任何颜色同白色混合颜色不变,同黑色混合变成黑色的原因。Screen(滤色)模式正好与Multiply(整片叠底)相反,Screen的算法是这样的: 255减去原通道的互补色乘以设定通道的互补色除以255,这里得注意运算的先后顺序。仍然以上述百分之五十的灰度固态层为例,其颜色通道阵列为[127,127,127],其补色为[255-127,255-127,255-128]=[128,128,128],然后添加Arithmetic特效,运算类型(Operator)设定为Screen(滤色),通道值设定为[128,128,0],其互补色为[127,127,255],将原通道的互补色乘以设定的通道的互补色然后再除以255即:{[128,128,128]*[127,127,255]}/255=[63,63,128],然后再将其从255中减去,也就是取其互补色得[192,192,127],这同样解释了为什么在滤色模式(screen)下任何颜色同白色混合变成白色,同黑色混合颜色不变的原因。
然后是Block Above和Block Below运算:Block Above:假如原始像素通道值比设定的通道值大,则原始像素通道值被设置为0;否则保留原始像素通道值;Block Below:假如原始像素通道值比设定的通道值小,则原始像素通道值被设置为0;否则保留原始像素通道值。还是以前面百分之五十的灰度图为例,Arithmetic中设置的RGB阵列值仍为[128,128,0],将运算类型(Operator)设置为Block Below,红色通道上,原始通道值127比设定的通道值128小,所以红色通道上的返回值为原始值即127,同理,绿色通道商道返回值也为127,在蓝色通道上,原始通道值127比设定的通道值0要大,所以蓝通道的返回值为0,因此其最终的返回值为[127,127,0,255],是一个黄色。
另外,在Arithmetic的运算类型(Operator)中还有两个相反的模式Min(最小值)和Max(最大值),这是我所不能理解的两个模式,官方文档提供的说法是:
Max:Set the channel value of the pixel to the greater of the specified value and the original value of the pixel.
Min:Set the channel value of the pixel to the lesser of the specified value and the original value of the pixel.
按字面意思理解,Max模式是将通道值设置为原始像素通道值和指定通道值两者之间值较大的那一个;而Min模式则是将通道值设置为原始像素通道值和指定通道值两者之间较小的那一个。单纯的按照其说明去理解并没有什么问题,但是如果结合到AE里的操作来理解,问题就出来了。还是在上面那个百分之五十灰度的固态层中,其颜色通道是[127,127,127],我们在Arithmetic中分别设定通道值为[255,255,255],然后将运算类型设置为Max(最大值),按照官方文档的说明,此时应取原值和设定的值当中较大的那个也就是我们设定的[255,255,255],结果应为白色,然而,事实正好相反,AE给出的结果是取原值也就是较小的那个,返回值为[127,127,127],仍是百分之五十的灰色。在Min模式下则正好和Max模式相反。因此,我怀疑这个地方有一个bug,Min和Max的选项弄反了。也许是我的理解有误,还望各位不吝赐教加以指导。
最后一个模式是Slice模式,官方文档是这样说明的:
Set the channel value of the pixel to 1.0 if the original value of the pixel is above the specified value; otherwise, set the value to zero. In both cases, the values for the other color channels are set to 1.0.
翻译过来是这样的:假如原始像素通道值比大于设定的通道值,则原始像素通道值被设置为1;假如原始像素通道值小于设定的通道值,则原始像素通道值被设置为0;这两种情况下其它颜色通道的像素值均被设置为1。同样这是一个很难理解的模式,而且,实际应用出来的结果与根据其说明推断出来的结果并不一致。在上面的例子中,假如我们将颜色通道值设定为[125,125,125],运算类型设定为Slice,那么,根据其说明,如果原始通道的值大于设定的值,则返回值为0,在这个例子中,原始值[127,127,127]大于我们设定的值[125,125,125],其返回值应为[1,1,1],而实际结果是[255,255,255]。在其原始值小于我们设定的值的情况下,其返回值应为[0,0,0],实际结果也是这样。或许我们可以这样理解这个Slice模式:如果原始通道值大于我们设定的通道值,则其返回值为1*255;如果原始通道值小于我们设定的通道值,则其返回值为0*255;如果原始通道值等于我们设定的通道值,则其返回值为0*255。
通过以上几个例子,我们能够清楚的了解到各种叠加模式背后的秘密,熟悉了这些算法,能够更深层次的理解各种叠加模式混合出来的效果。同时,有一些模式得出的结果也与AdobeAfterEffects官方帮助文档中提供的说明大相径庭,或许,不应该过分相信官方文档。
由于成文仓促,未及添加相关图片说明,望各位见谅。
标签: AE, Arithmetic, 内置特效, 原理, 叠加模式, 混合模式, 算法
发表在:软件·教程
