作者: UCNV,坐标东京的程序员、艺术家。开发不同程序以破坏图像和电影格式,由此创造视觉作品并让不同的效果分别发挥作用。
本文未经允许不得转载,更多精彩文章请订阅《程序员》
UCNV授权《程序员》整理翻译并本文。译/郭韵,暨南大学外国语学院讲师,同声传译员。
PNG是一种图像格式,始于1995年,作为一种颇受欢迎的图像格式,PNG至今仍十分盛行。一般而言,PNG以无损失压缩或处理透明像素的能力为人所知。然而,我并不想从泛泛的角度去看待不同的图像格式,而是尝着用不同的方式让它们发生故障,你有没有想过,PNG发生故障时是什么效果呢?
校验和(Checksum)
让我们首先来看看校验和(Checksum)系统中的CRC32算法。这一算法通常用于确认受损图像,当它侦测到图像文件受损时,不会在一般的图片阅读器上显现出来。因此,若想使PNG发生故障,用诸如文本编辑器或二进制编辑器重写部分二进制数据的简单方法是行不通的。换句话说,“黑掉”PNG之难,难于上青天。
因此,为了能顺利“黑掉”PNG,我们需要根据PNG的格式规范(PNG Specification)来做。这意味着,解码CRC32算法后要对数据进行重写和重新计算,并将其绑定到已经编辑的数据上。
状态(State)
接下来,我们看看PNG的转码过程。表1简要地显示了PNG编码流工作流程。包括四步:原始数据、过滤后数据、压缩后数据、格式化的PNG。
理论上来说,上述四个步骤都可以成为“下手”的目标。然而,从“原始数据”下手跟从BMP下手一样,技术上而言,并不能把它称之为“PNG故障”。而以最后一步“格式化的PNG”为目标也行不通,原因在于上文提到的校验和系统的工作原理,因此无法产生故障。
现在,能供我们下手的就只有“过滤后数据”或“压缩后数据”两个步骤,只要方法正确,就可以使PNG故障形成。当我攻击“过滤后数据”时,产生的效果非常明显,故障元素好像花瓣一样弥漫了整张图像,过滤器之间的差异在“过滤后数据”受到攻击时变得尤为明显。另一方面,“压缩后数据”故障受到了它们自身的压缩算法的影响(Deflate压缩),因此显示出了一种与雪花噪点类似的图片效果。
当然,在转码过程之外,也有其他的过程能影响PNG故障的图案,例如透明像素和interlace。
五重过滤(Five filters)
决定PNG故障图案最重要的决定因素是过滤的过程,这一过程通过某种算法将每一层扫描线的为压缩像素数据进行转换,从而提升压缩效率。过滤包括四种算法和五种过滤类型,分别为Sub、Up、Average、Paeth和None(None为无过滤)。PNG图像通常在使用最适当的过滤类型对每一层扫描线进行过滤后才开始压缩,因此,在PNG图像生成之后,五种压缩会合为一体。
这五种过滤通常只是促进压缩效率的提升,因此无论使用哪一层过滤,输出结果都一样。然而,当过滤后的数据受到损坏后,输出结果会显示出明显的差异。当一个图像经过优化,并同时具备上述五种过滤效果后,就很难辨别出不同的过滤效果。然而当同一个单一的过滤应用在每一条扫描线上,图像出现故障时,差异就很明显了。
下面我会展示每一种过滤的效果差异,当我们仔细留意不同的效果时,会发觉哪一种过滤会让PNG故障的部分产生哪种美丽的效果。是的,这些图像的确很美丽。
故障: 实例
图1、图2展示了通过攻击过滤后数据得到的图像。原始PNG已经优化了添加到每一个扫描线的过滤层,五种过滤中所有类型都已叠加。故障反映出五种过滤之间在结合的时候是如何平衡的。
不同过滤类型之间的差异
现我们来看看每一种过滤类型之间的差异。
图3使用了None过滤,即原始数据故障。在这个状态之下,每一个像素单独存在,像素间无任何关联,因此,单单重写字节不会对图片造成广泛的影响。
图4使用了Sub过滤类型,添加到每一条扫面线上。当使用Sub算法时,目标像素通过参照右边的像素进行自我重写。这也是为什么这类故障会向右倾斜。
图5中过滤名为Up,该过滤类型与Sub类似,但参照方向在顶部和底部。
如图6所示,Average这一过滤的表现为斜角角度,它所产生的柔化效果也是该类过滤的特点之一。使用Average filter时,PNG故障效果的“故障感”不强。
如图7所示,Paeth这一过滤的算法在众多过滤中最为复杂,因此也具备最复杂的故障效果。该故障会对图像的不同部位产生影响,即使在最少字节重写的情况下也是如此。PNG故障的主要效果正是由该过滤引起,原始图像中的元素得以保存,却遭到了很大的损坏。
压缩后的故障
图8就是我在前文描述为“压缩数据”的故障状态。出现了大量雪花噪点,很难在图像中辨认出原图像。这一故障偶尔能显示出不同的过滤效果,但图像通常都已经损坏。
透明
我们看看当图像中包含透明像素时故障后的效果。
这种透明效果很明显,尤其是Average这一过滤看起来将透明像素逐渐揉合。透明像素的完全聚合也是作为彩色部分用同样的手法来处理。其实Up这一过滤通常是应用在彩色部分上的。
还有一种可能,更新的一般性图像格式会根据该图像是否有彩色部分,或当图像为复杂图像时(如照片),转变它们的压缩模式。使用包括实体彩色部分的图像来测试故障不失为一种有用的方法,WebP就是其中一个例子。
交错(Interlace)
PNG交错层可以使用基于8*8像素的Adam 7算法,分为7种通路。当PNG发生交错故障时,我们能够直接看出来。我们还可以通过中间是否出现了类似“缝合”的效果(它的角度在朝向Average过滤率的方向逐步收窄)来判断这一故障是否属于交错故障。
总结
与JPEG或其他较新的图像格式相比,PNG是一种非常简单的格式。其中的过滤算法就像玩具,它的压缩方法跟传统的Zip压缩很类似。然而,这种简单的图像格式展现了多种多样不同的故障类型。也许我们本来只需要一个例子去解释JPEG故障,却需要许多不同类型的例子来解释何为PNG故障。最初,PNG是作为GIF之外的另一种图像格式而出现的。然而,当讲到故障时,GIF格式跟PNG相比就太苍白无力了。PNG已经具备了令人惊艳的不同效果,只是长期以来,为校验和这一障碍所掩盖。
PNGlitch库
我在2010年曾经发表过一段关于PNG故障的脚本。当时,这一脚本只是剔除了CRC32,并且在内部数据故障后又重新加进去。此后,为了能将其实际应用在自己的工作中,我一直在重写并且不断修