幻影坦克图片制作方法

所谓“幻影坦克”就是指带透明度的PNG图片可以在白色和黑色背景下呈现不同的图案,名字来源于知名RTS游戏《红色警戒》中的某奇葩兵种。其中一种实现方案是把两张图片隔行交错放在一起,然后利用透明度在黑底和白底下分别显示奇数和偶数行。网络上有很多幻影坦克的Photoshop教程,本文主要说一下叠加型幻影坦克的具体工作原理和程序实现。

首先来说一下透明度叠加的原理。对于RGB的某一个通道,设M为通道值的上限,待叠加像素处的背景色通道值为b∈[0,M],要叠加的前景像素的通道值为v∈[0,M],透明度为a∈[0,M],叠加后的值为r∈[0,M],则叠加结果为
r=va/M+b(M-a)/M
其中透明度a可以理解为前景和背景混合的权值,a越大则前景“贡献”越大。对RGB三个通道分别进行叠加过程即可完成彩色图片的叠加。

而在幻影坦克中,通常是把彩色图像转换为灰阶图像,也就是只对亮度进行处理。人眼对亮度的感觉和物理亮度之间并非线性,Gamma定义了它们之间的映射。在不同的颜色系统、不同的Gamma下转换的经验公式也不同。我推荐使用以下语句进行转换(24位RGB,>>运算符表示右移位)

制作幻影坦克的关键就在于调整输出图像中每个像素的亮度v和透明度a,使得该像素与纯黑、纯白背景叠加时分别显示为期望的亮度。设x1为希望在白色背景下显示的亮度值,x2为暗色背景下的亮度值,则由叠加公式得到一个关于v和a的二元方程组
x1=va/M+M-a
x2=va/M
当x2≥x1时解得
v=Mx2/(x2-x1+M)
a=x2-x1+M
输出像素的ARGB值即为(a,v,v,v)

从上式可以看出,黑背景用图必须在每个像素上不亮于白背景用图才能实现混合(否则解得的值会大于M,这是不允许的),这对输入图像的要求很高。简单的处理方法是将[0,M]分为两个区间,将两幅图片的亮度分别线性映射到两个区间。调整区间的分法即可调整图像的显示效果。

下面附一个本人制作的简易幻影坦克生成工具(https://azurefx.name/download/miragetank),需要.net Framework 4环境。关于这篇文章如果想和我交流,可以写邮件至i@azurefx.name。