透明度、填充、图层混合模式的综合算法

  透明度和填充的区别,曾经在之前的本区讨论中被提出,针对其讨论也有。由于此二者在算法上的形式和看到的主管效果基本完全相同,但作用区域(算法中的位 置)不同,因此他们极其容易含混不清。在此,我将具体解释填充的含义。在此之前,先对一些基本图层混合算法做一些必要的介绍。(即使无人关心算法)。并且 首先声明,本文对图层混合模式的算法部分主要参考了photoshop的帮助文件以及网络上的下面这片帖子:
色影无忌 ([url]http://www.cameraunion.net/)[/url]
------ 扫描仪与图像处理 ([url]http://www.xitek.com/forum/forumdisplay.php?forumid=55)[/url]
------------ 图层混合模式(Blending Modes)的数学描述
([url]http://www.xitek.com/forum/showthread.php?threadid=188713)[/url]
这里讨论几种最基本的图层混合模式。(目前尚有少数混合模式算法不祥)
层A和层B混合,层A在下,层B在上,a, b对应其某通道的灰度值,混合层对应通道的灰度值用公式f(a,b)表示。现在求f(a, b)=?。(用f(a,b)表示图层混合结果,在后面还会用这个形式表示)
混合模式中有的是可交换,有的是不可交换的,(“可交换”意味着交换层A和层B,结果一样;否则可能不同),这里讨论的都是可交换的。

图片设为位深度为8×3(RG=24,即灰度区间为(a和b取值范围)[0,255]。(即二进制的00000000~11111111)
在ps的所有处理结果受到灰度区间限制,因此,如果算法所得的第一结果超出灰度区间,将被灰度区间的边缘截断,即结果小于0时结果=0,结果大于255时结果=255。以下算法表达中为了形式简单明了,对超出灰度区间的结果不作声明。
1.线性减淡:a+b              (可见合成结果变亮)
2.线性加深:a+b-255       (合成效果为变暗)
3.正片叠底:ab/255           (变暗了)
4.滤色(屏幕):255-(255-a)(255-b)/255 (即a和b反相图作正片叠底的结果再取反相)
         可化简为:a+b-ab/255 (变亮了)
5.变亮:max(a,b)
6.变暗:min(a,b)              (效果显而易见)
7.排除:a+b-ab/128             (原图中大于128被变暗,小于128则被变亮)
8.差值:|a-b|

从上面的算法中可以了解到的性质,
1).与黑色RGB(0,0,0)正片叠底,结果为黑色,与白色RGB(255,255,255)正片叠底,结果不变。
2).与黑色滤色,结果不变。与白色滤色,结果为白色。
3).最后我再解释一下滤色模式,滤色即加色算法,例如红+绿=黄,绿+蓝=青,(蓝+红=是不是叫紫?)
在有的英文版中叫做screen(屏幕),这是为何,一句话概括之,它相当于使用两台投影仪同时打在同一个屏幕上的结果,(这也是加色的实际物理意义)。显而易见,结果必然会变得更亮。
最后稍作解释一下。
先强调一下,当你调节了透明度和填充以后,我们看到的叫做混合结果,或者输出结果,(我们可以看到ps cs中将其称为“合并图层”)这个结果的RGB数据和图层中的数不是同一个。当然你可以把结果输出在一个新的图层里。

透明度,主要是应用在图层方面的概念。而填充,可以理解为象素方面的概念。这里有一个象素拥有比例的问题,不是很好理解。它和羽化的概念是相通的。也就是 象素的比例问题,例如,羽化是把选区的边缘模糊掉了,它把象素是否被选中定义为一个概率或者比例。填充同样如此,当这个图层的填充度为80%时,表示这个 图层只拥有输出结果象素的80%,而象素我们知道是最小单位,是不可分割的,另外20%必须有所归属。由于填充之前,这里是一个空图层(没有象素),因此 这20%的归属即来自于其下面的图层。因此,我们看到的结果象素是80%由上层填充,20%由下层填充所得到的。如果填充为0%,那么说明这里没用象素, 当然我们看到的结果直接就是下层象素。

那么透明度呢,表示的是两个图层之间的比例关系,其算法形式完全相同。但是它的计算是在图层之间进行整体控制和计算,其作用域位于最外围,涵盖了图层之间的所有本身固有信息包括图层样式等等。

而图层样式是施加在图层方面的额外添加和控制,因此它不会受填充影响,只能由控制图层层次的透明度来控制。

它们的顺序是,首先有图层中的数据a,b计算出混合结果,然后使用填充度给出中间输出结果,然后应用图层样式,最后使用透明度给出最终输出结果。即按照下面的次序:图层混合->填充->图层样式->透明度

因此,透明度和填充,两者相当于调度,填充属于微观象素调度,透明度属于宏观图层调度,透明度的调度级别比填充高一个层次。

如果是多个图层呢,每个图层都有自己的透明度,例如三个图层,
结果是k1*c+(1-k1)*【(k2* b+(1-k2)*a 】
因此输出结果是层层向上计算的。

你可能感兴趣的:(透明度,混合)