也许你刷到过这样的图片,微缩图时呈现的是图像A,当你点击图片后,又是另外一幅图像B,惊讶的你再三确定,这的确是一张静态图片,并非GIF格式的单次循环动图,即便是学习过图片制作的读者,估计一时半会也很难说清楚其中的原理,本文将为你详细分析此类隐藏图的显示原理,以及介绍一种用Photoshop制作隐藏图的最简单方法。
隐藏图介绍
下面这张图片就是一张隐藏图,但不是所有读者都能看到两幅图像,首先你要确定手机系统的夜间模式是关闭的,然后你阅读本文的平台,还要支持点击图片后缩放;又或者有些读者看到的是两张图片的叠加效果,这是因为你查看图片的背景是灰色,而不是纯白色或者纯黑色。
把两张图像提取出来如下图:
可以看到,两张图片都是灰色图,这是因为灰色图中每个像素的R、G、B值都相等,不包含颜色信息,这样更容易实现两张图片在不同背景下的相互隐藏。
隐藏图的原理
隐藏图一般都是使用32位的PNG格式,PNG是一种常用的静态图片格式,与jpg最大的不同是,PNG拥有R、G、B和Alpha四个通道,而jpg只有R、G,B三个通道,其中Alpha通道是透明通道,能储存0~255的256(2^8,32位图)级的透明度。隐藏图的关键,就在于透明通道的利用,所以不带透明通道的图片格式无法制作隐藏图。
我们想象一张半透明的图片,显示器在给我们展示这张图片时,不可能让显示屏变得半透明的,显示屏必须选择一个背景来展示这张半透明图片,常作为背景的有网格图案、灰度、白色、黑色等等。
在绝大部分平台上,会使用白色或者黑色作为透明图片的背景,或者在微缩图时用白色做背景,当你点击图片后换成黑色背景,正是这种背景切换,才实现了隐藏图的效果。
隐藏图的数学原理分析
这里我们必须要了解图片在屏幕中的显示原理,假设PNG图片中RGB为一个合并图层A,透明通道为图层α,背景图层为B,显示器要显示的效果为F,其中背景图层B处于最下层,那么有公式:
F=α·A+(1-α)·B;
我们的智能设备就是通过这个公式来计算的,最终把图片效果输出到显示屏,其中透明图层α,描述了图片和背景之间的加权值。
对于PNG格式的每个像素,都有(R,G,B,α)四个量来描述,灰度图片中R=G=B,α我们理解为透明度的话,取值范围就是0≤α≤1。
对于白色背景,像素值就是(0,0,0,1)
对于黑色背景,像素值就是(255,255,255,1)
对于一张隐藏图X=(R,G,B,α)来说,我们需要实现的效果是:
与白色背景混合得到图像A,与黑色背景混合得到图像B,图像分别与白色背景或者黑色背景混合之后有公式:
A=α·X+(1-α)·白色背景
B=α·X+(1-α)·黑色背景
我们把R、G、B的范围也定义在0~1(对应0~255)之间,并且统一用R表示,那么公式可以表示成:
其中图像A和图像B是已知的,而且与隐藏图X的一样,有R=G=B,所以两个方程有两个未知数,X和α是可以求解的,最终的求解结果为:
这就是隐藏图的数学原理,由于取值范围的限制,需要图像A的像素亮度大于图像B对应像素的亮度,所以利用该原理制作隐藏图时,我们需要适当地把图像A提亮,把图像B降暗,而且要使用灰度图片(既是R=G=B),否则方程组不一定有解,或者求解难度极大。
该方法称作公式法,适用于编程制作隐藏图,在Photoshop中,很难利用计算功能和混合模式来制作隐藏图。
利用该方法,我们可以制作很多有趣的隐藏图,比如我们只考虑背景颜色切换,从而做出白天和夜晚切换的效果,就可以制作(伪)彩色的隐藏图,如下图。
在另外一篇文章中,我将介绍一种用Photoshop,来简单实现隐藏图制作的简单方法,该方法可以把任意两张图片合成为一张黑白隐藏图,隐藏图可以在黑白背景下实现相互隐藏,即便是PS新手也能制作。