一、描述
所有内容摘自维基
在处理图象时可能需要手撸图片混合的代码,此时混合公式就十分重要。而正常混合(Normal Blending)模式是最常用的一种格式(比如PS的默认图层混合模式)。想手动实现时却发现搜“正常混合”搜不出结果,因此写一篇文章增加后来人的搜索命中率。
“正常混合”是什么?
顾名思义,就是上层图片覆盖下层图片。从感官上,上层的颜色不应该被下层影响。
比如A覆盖B:
- 当两张图片完全不透明时A的像素取代B的像素。
- 而A、B非不透明时,透明度则在此次混合中起关键作用。
因此“正常混合”其实实质是“透明度混合(Alpha Blending)”
二、公式
1.一般公式
透明度混合公式由Thomas Porter和Tom Duff定义
设A覆盖B
C表示Color(不包括不透明度通道)
α表示不透明度通道
下标A,B,O分别表示上层图像、下层图像、覆盖后图像
则对透明度有:
α
o
=
α
a
+
α
b
(
1
−
α
a
)
{\displaystyle \alpha _{o}=\alpha _{a}+\alpha _{b}(1-\alpha _{a})}
αo=αa+αb(1−αa)
或者写成更常见的另一种形式:
α
o
=
1
−
(
1
−
α
a
)
∗
(
1
−
α
b
)
{\displaystyle \alpha _{o}=1-(1-\alpha _{a})*(1-\alpha _{b})}
αo=1−(1−αa)∗(1−αb)
对颜色通道有:
C
o
=
C
a
α
a
+
C
b
α
b
(
1
−
α
a
)
α
o
{\displaystyle C_{o}={\frac {C_{a}\alpha _{a}+C_{b}\alpha _{b}(1-\alpha _{a})}{\alpha _{o}}}}
Co=αoCaαa+Cbαb(1−αa)
2. 下层完全不透明情形
网上更多的是这种情况,虽然形式更简单了,但事实上这个只在下层为完全不透明时适用。
令
α
b
\alpha_{b}
αb为1,则有:
α
o
=
1
{\displaystyle \alpha _{o}=1}
αo=1
C
o
=
C
a
α
a
+
C
b
(
1
−
α
a
)
{\displaystyle C_{o}={C_{a}\alpha _{a}+C_{b}(1-\alpha _{a})}}
Co=Caαa+Cb(1−αa)
3.当颜色为“预乘透明度”的情形
当颜色为**预乘透明度(premultiplied alpha)**时,它的颜色通道预乘了α通道的值。
具体含义不在此展开,只给出此情形的透明度混合公式:
α
o
=
α
a
+
α
b
(
1
−
α
a
)
{\displaystyle \alpha _{o}=\alpha _{a}+\alpha _{b}(1-\alpha _{a})}
αo=αa+αb(1−αa)
C
o
=
C
a
+
C
b
(
1
−
α
a
)
{\displaystyle C_{o}=C_{a}+C_{b}(1-\alpha _{a})}
Co=Ca+Cb(1−αa)