1984 年 7 月《计算机图形》杂志 18 期 253 - 259 页,刊登了Porter Thomas 和 Duff Tom 的论文《Compositing Digital Ima-ges》,文中讲述了12个合成规则,这些规则都是基于一些简单的数学等式。
文中提出一个重要的alpha channel的概念,并定义了源图像(正在绘制的基元)和目标图像(图形区域)的像素的alpha分量和颜色的值。
每个案例都描述了在一个蓝色矩形(目标图像)上绘制一个红色椭圆的图像(源图像)。
porter/duff混合公式
Cr=Cs*Fs+Cd*Fd
Ar=As*Fs+Ad*Fd
F表示作用于C或A上的因子,F即factor
因子 A 代表这个像素的alpha通道,C代表这个像素的每个颜色分量。
下标 r、s 和 d分别 代表这个像素的 结果(result)、源 (source) 和 目标 (destination)。
As 代表(绘制到图形区域的基元) 源 的alpha通道,
Ad 代表已经在图形区域上的像素的alpha 通道。
Ar 最终计算结果的alpha通道。这个等式中的所有值都是在0.0和1.0之间的 浮点数,计算结果也位于这个范围。
Porter和Duff的12个规则
每个案例都描述了在一个蓝色矩形(目标图像)上绘制一个红色椭圆的图像(源图像)。
Source Over (源覆盖)
这是默认模式。源的Alpha用于在目标顶部混合像素。
Fs=1,Fd=(1-As)
Ar=As+Ad*(1-As)
Cr=Cs+Cd*(1-As)
Clear
独立于源,清除目标中的像素( 将其设置为完全透明)。
Fs=Fd=0
Ar=0
Cr=0
目标中的颜色和alpha都被清除掉。无论用什么颜色或形状来绘制,被源覆盖的每个目的地 的像素都会消失,如图所示。
Destination
输出是目标像素。这意味着混合无效。此模式与Source相反。
Fs=0,Fd=1
Ar=Ad
Cr=Cd
DestinationAtop
目标像素混合在源的顶部,目标像素的alpha减少了源像素的alpha。此模式与SourceAtop相反。
Fs=(1-Ad),Fd=As
A =As*(1-Ad)+Ad*As)=As
Cr=Cs*(1-Ad)+Cd*As
DestinationIn
输出是目标,其中的alpha值被源的alpha值减小。此模式与SourceIn相反。
Fs=0,Fd=As
Ar=Ad*As
Cr=Cd*As
位于源内部的那部分目的地取代目标。它与DstOut相反,但是,如果使用50%的alpha 值,两种操作看起来一样。
DestinationOut
输出是目标图像,其中的alpha值由源的A值而减少。此模式与SourceOut相反。
Fs=0,Fd=(1-As)
Ar=Ad*(1-As)
Cr=Cd*(1-As)
位于源外部的那部分目的地取代目标。它与DstIn相反,但是,如果使用50%的alpha 值,两种操作看起来一样。
DestinationOver
目标的Alpha用于将其混合在源像素的顶部。此模式与SourceOver相反。
Fs=(1-Ad),Fd=1
Ar=As*(1-Ad)+Ad
Cr=Cs*(1-Ad)+Cd
目的地与源组合,然后用这个结果取代目标。位于目标之外的那部分源通常用这个合成的累加的不透明度绘制。
Source
输出是源像素。 ( 这意味着基本的复制操作,并且在源像素不透明时与SourceOver相同)。
Fs=1,Fd= 0
Ar=As
Cr=Cs
源复制到目的地。目的地由源来代替。在图中,蓝色矩形(目的地)没有显示在红色 椭圆下面,因为红色椭圆(源)代替了它。
SourceAtop
源像素在目标顶部混合,源像素的alpha减少了目标像素的alpha。
Fs=Ad,Fd =(1-As)
Ar=As*Ad+Ad*(1-As)=Ad
Cr=Cs*Ad + Cd*(1-As )
位于目标内部的那部分源与目标组合。位于目的地之外的那部分源丢弃掉。
SourceIn
输出是源,其中的alpha值将减去目标的alpha值。
Fs=Ad,Fd = 0
Ar=As*Ad
Cr=Cs*Ad
位于目的地内部的那部分源代替目的地。位于目的地之外的那部分源丢弃掉。
SourceOut
输出是源,其中目标的alpha值减小了最终的A值。
Fs=(1-Ad),Fd= 0
Ar=As*(1-Ad)
Cr=Cs*(1-Ad)
位于目的地之外的那部分源代替目的地。位于目的地内部的那部分源丢弃掉。
Xor
源( 其alpha值与目标alpha值的负数)与目标合并,该目标的alpha值与源alpha的倒数成反比。 CompositionMode_Xor与按位Xor不同。
Fs=(1-Ad),Fd=(1-As)
Ar=As*(1-Ad)+Ad*(1-As)
Cr=Cs*(1-Ad)+Cd*(1-As)
位于目的地之外的那部分源与位于源之外的那部分目的地结合。