这张图片的Alpha通道中的值越往下越趋近于零。
在计算机图形学领域，**Alpha合成**（英語：）是一种将图像与背景结合的过程，结合后可以产生部分透明或全透明的视觉效果。Alpha合成也叫**阿尔法合成**或**透明合成**。渲染图像时，通常会将目标图像中的多个子元素单独渲染，最后再把多张子元素的图片合成（英语：）为单独的图像。例如，电视直播时就会将大量计算机生成的图像元素合成到现场镜头上。

要正确结合图像元素，每个元素的必须有对应的遮片（英语：）。遮片包含覆盖范围信息——图中几何对象的形状——可以藉此分辨图像中的任意位置到底是被绘制的几何对象本身，还是逻辑上的「空白」区域。

描述
--

为了保存遮片信息，匠白光提出了Alpha通道的概念，后由托马斯·波特（英语：）和汤姆·达夫（英语：）完善。二维图像里记录着每个像素的颜色信息，额外的信息以 0 和 1 之间的值表示，记录在Alpha通道里。0 表示该像素没有覆盖信息，是透明的，即图中的几何体没有覆盖到本像素；而 1 则表示像素不透明，几何体完全覆盖了此像素。

图像中使用的Alpha通道通常有两种表示形式：**平直Alpha**（英語：）和**预乘Alpha**（英語：）。

* 如果使用平直Alpha，图像中的RGB分量仅表示像素的颜色，与是否透明无关。
* 如果使用预乘Alpha，图像中的RGB分量也表示像素的颜色，但事先已经和不透明度做了乘法。某些使用场景下，这样的做法可以在后续合成时节省一次乘法。不过预乘Alpha的最显著优势在于使用简单、准确而非性能。

如果用平直的（非预乘）RGBA 元组表达像素颜色，那么像素值 (0, 0.7, 0, 0.5) 表示像素有 70% 的最大绿色亮度，同时不透明度是 50%。同样条件下的纯绿色是 (0, 1, 0, 0.5)。而如果用预乘Alpha，此处的 RGB 值 (0, 0.7, 0) 需要都乘以 0.5，表达为 (0, 0.35, 0, 0.5)。虽然此处 G 通道的值是 0.35 ，但它表示的还是最大亮度的 70%（其中包含了 50% 的不透明度）。此时的纯绿色则需要表达为 (0, 0.5, 0, 0.5)。因此，了解图像（文件）到底使用的是平直Alpha还是预乘Alpha非常重要，只有这样才能对图像做正确的处理和合成。

有了Alpha通道，图片的合成操作就可以用合成代数（英语：）的形式表达。假设有图像元素 A 和 B，最常见的合成操作就是把 A 作为前景、B 作为背景，我们称这种操作（运算）为 **over**，记作 {\displaystyle A\operatorname {over} B}。除此之外，波特和达夫还定义了其它几个运算符：**in**、**out**、**atop**、**xor**：

运算符 **over** 的效果与普通绘画效果一致（见画家算法），运算符 **in** 则等价于裁剪。

以运算符 **over** 为例，运算结果相当于对图像中的所有像素做以下公式：

{\displaystyle \alpha \_{o}=\alpha \_{a}+\alpha \_{b}\left(1-\alpha \_{a}\right)}
{\displaystyle C\_{o}={\frac {C\_{a}\alpha \_{a}+C\_{b}\alpha \_{b}\left(1-\alpha \_{a}\right)}{\alpha \_{o}}}}
其中 {\displaystyle C\_{o}} 是运算结果，{\displaystyle C\_{a}} 是图像 A 中的像素，C\_{b} 是图像 B 中的像素，而 {\displaystyle \alpha \_{a}} 和 {\displaystyle \alpha \_{b}} 则分别是图像 A、B 中对应像素的Alpha值。

如果假设颜色值都是预乘了Alpha值的（{\displaystyle c\_{i}=\alpha \_{i}C\_{i}}），那么我们就可以将等式进行改写，结果图像中的颜色即：

{\displaystyle c\_{o}=c\_{a}+c\_{b}\left(1-\alpha \_{a}\right)}
结果中的Alpha值即：

{\displaystyle \alpha \_{o}={\frac {c\_{o}}{C\_{o}}}=\alpha \_{a}+\alpha \_{b}\left(1-\alpha \_{a}\right)}

over 运算符的解析推导
-------------

通过研究正交覆盖，Porter 和 Buff 给出了 alpha 合成的几何解释。在 1981 年 Bruce A. Wallace 的论文里则给出了另一种基于的反射率/透过率的物理模型的另一种推导。

第三种推导方法通过使用两条简单的假设得到。为了简单起见，我们将 **over** 运算符简记成 {\displaystyle a\odot b}。

第一条假设是当背景是不透明（即 {\displaystyle \alpha \_{b}=1}）时，**over** 运算符表示前景颜色与背景颜色的凸组合：

{\displaystyle C\_{o}=\alpha \_{a}C\_{a}+(1-\alpha \_{a})C\_{b}}
第二条假设是这种运算应该满足结合律：

{\displaystyle (a\odot b)\odot c=a\odot (b\odot c)}
现在，可以假设 a 和 b 包含不透明度分量，而 c 不包含。考虑中间变量

{\displaystyle o=a\odot b}.
由于结合律成立，有

{\displaystyle o\odot c=a\odot (b\odot c)}
由于 c 是不透明的，因此 {\displaystyle b\odot c} 也是不透明的。由第二条假设，在上面的式子中，上式地每个 {\displaystyle \odot } 运算都可以用凸组合表达：

{\displaystyle {\begin{aligned}\alpha \_{o}C\_{o}+(1-\alpha \_{o})C\_{c}&=\alpha \_{a}C\_{a}+(1-\alpha \_{a})(\alpha \_{b}C\_{b}+(1-\alpha \_{b})C\_{c})\\&=[\alpha \_{a}C\_{a}+(1-\alpha \_{a})\alpha \_{b}C\_{b}]+(1-\alpha \_{a})(1-\alpha \_{b})C\_{c}\end{aligned}}}
这个式子的两边都满足 {\displaystyle X\_{0}+Y\_{0}C\_{c}=X\_{1}+Y\_{1}C\_{c}} 的形式，令 {\displaystyle X\_{0}=X\_{1}} 且 {\displaystyle Y\_{0}=Y\_{1}}，可以得到：

{\displaystyle {\begin{aligned}\alpha \_{o}&=1-(1-\alpha \_{a})(1-\alpha \_{b}),\\C\_{o}&={\frac {\alpha \_{a}C\_{a}+(1-\alpha \_{a})\alpha \_{b}C\_{b}}{\alpha \_{o}}},\end{aligned}}}
至此，我们推导出了 {\displaystyle o=a\odot b} 的颜色和其 alpha 分量的解析式。

注意到 {\displaystyle (1-\alpha \_{a})\alpha \_{b}=\alpha \_{o}-\alpha \_{a}}，这样，上式可以紧凑地表示成

{\displaystyle C\_{o}={\frac {\alpha \_{a}}{\alpha \_{o}}}C\_{a}+\left(1-{\frac {\alpha \_{a}}{\alpha \_{o}}}\right)C\_{b}}
{\displaystyle \odot } 运算符满足非交换幺半群的定义。这个群的单位元 e 是所有满足 \alpha =0 的二元组 {\displaystyle \langle C,\alpha \rangle }，这可以通过式子 {\displaystyle e\odot a=a\odot e=a} 得到。

Alpha混合
-------

**Alpha混合**（英語：）是将半透明的前景色与背景色结合的过程，可以得到混合后的新颜色。前景色的透明度不限，从完全透明到完全不透明都可以。如果前景色完全透明，混合后的颜色就是背景色；如果前景色完全不透明，混合后的颜色就是前景色；如果在这两种极端情况之间，混合后的颜色可以通过前景色和背景色的加权平均计算。

Alpha合成后的颜色可以这样计算：

{\displaystyle {\begin{cases}\mathrm {out} \_{A}=\mathrm {src} \_{A}+\mathrm {dst} \_{A}(1-\mathrm {src} \_{A})\\\mathrm {out} \_{RGB}={\bigl (}\mathrm {src} \_{RGB}\mathrm {src} \_{A}+\mathrm {dst} \_{RGB}\mathrm {dst} \_{A}\left(1-\mathrm {src} \_{A}\right){\bigr )}\div \mathrm {out} \_{A}\\\mathrm {out} \_{A}=0\Rightarrow \mathrm {out} \_{RGB}=0\end{cases}}}
如果背景色不透明，即 {\displaystyle dst\_{A}=1}，代入上述方程后可以得到：

{\displaystyle {\begin{cases}\mathrm {out} \_{A}=1\\\mathrm {out} \_{RGB}=\mathrm {src} \_{RGB}\mathrm {src} \_{A}+\mathrm {dst} \_{RGB}(1-\mathrm {src} \_{A})\end{cases}}}
如果使用了预乘Alpha，最初的方程组可以简化为：

{\displaystyle {\begin{cases}\mathrm {out} \_{A}=\mathrm {src} \_{A}+\mathrm {dst} \_{A}(1-\mathrm {src} \_{A})\\\mathrm {out} \_{RGB}=\mathrm {src} \_{RGB}+\mathrm {dst} \_{RGB}\left(1-\mathrm {src} \_{A}\right)\end{cases}}}

伽玛校正
----

不考虑伽玛校正，直接做 Alpha 混合的效果。
考虑伽玛校正，做 Alpha 混合的效果。
计算机图像一般不直接存储光照亮度对应的 RGB 值，而是需要先对这些值做伽玛校正。

伽玛校正的大致过程如下：

* 设 {\displaystyle displayed\_{RGB}} 为屏幕上显示的 RGB 亮度（标准化后的亮度值，在 0 和 1 之间）
* 设 {\displaystyle stored\_{RGB}} 为计算机内存中所存储的 RGB 亮度（也是标准化后的亮度值）
* 设 \gamma  为用于「解码」{\displaystyle stored\_{RGB}} 图像的伽玛值 2.2（2.2 为 \gamma  的典型取值）

则它们三者之间的关系为

{\displaystyle displayed\_{RGB}={stored\_{RGB}}^{\gamma }}
因此，在处理计算机图像的 RGB 值时（尤其是做 Alpha 混合时），可以在处理前先将伽玛校正消除，完成处理后再重新做伽玛校正，这样做的效果比直接处理伽玛校正后的 RGB 值要好。

例如有一张图片 {\displaystyle overlay\_{rgb}}，它对应的 Alpha 通道为 {\displaystyle overlay\_{\alpha }}，现在要把它叠加到背景图 {\displaystyle background\_{rgb}} 上，那么最终的图像 {\displaystyle out\_{rgb}} 可以这样计算：

{\displaystyle out\_{rgb}=({overlay\_{rgb}}^{\gamma }\times overlay\_{\alpha }+{background\_{rgb}}^{\gamma }\times (1-overlay\_{\alpha }))^{1/\gamma }}
此处的 {\displaystyle out\_{rgb}} 是计算机内存中所存储的数据；在计算机显示器上会以 {\displaystyle out\_{rgb}^{\gamma }} 的数据显示。

参考资料
----

1. ↑  Porter, Thomas; Tom Duff.. Computer Graphics. 1984, **18** (3): 253–259. ISBN 0-89791-138-5. doi:10.1145/800031.808606.   
（见 pixar.com. （页面存档备份，存于））
2. ↑ . tomforsyth1000.github.io.  [8 May 2018]. （原始内容存档于2017-12-12）.
3. ↑  Wallace, Bruce A.. SIGGRAPH Computer Graphics (New York City, New York: ACM Press). 1981, **15** (3): 253–262. ISBN 0-89791-045-1. doi:10.1145/800224.806813.