PNG和隐藏像素

2020-09-01 16:03:28

几年前,我给FotoForensics添加了一个隐藏像素分析器。此分析器执行两项操作:如果图片具有Alpha通道(例如,具有透明层的PNG),则它允许您查看没有Alpha通道的图像或单独查看Alpha通道。它还提供了聚焦于Alpha通道的覆盖,但也允许您查看其余内容。

如果图片有过多的边框填充,例如使用JPEG(不是网格对齐的),则它会扩展图像以显示边框填充。

在过去的几个月里,我看到了第三种隐藏像素的增加:PNG填充。几乎所有这些目击事件都与隐写术挑战、夺旗取证比赛和类似的谜题有关。(自从因为新冠肺炎的缘故,人们开始呆在家里,人们对安全、隐写术和相关话题的兴趣似乎增加了。)。如果你对这些类型的挑战感兴趣,这里有很多起点。例如:FotoForensics的元数据和隐藏像素分析器可以帮助解决其中一些挑战。我已经修改了Hidden Pixels分析器,以查找可以在PNG图像中隐藏的另外两种类型的数据:列填充和未使用的行。(这是一篇技术博客文章,介绍了PNG如何编码像素、何时添加列填充以及如何创建行填充。)。PNG以光栅格式存储像素。每个像素具有1、3或4个颜色通道,具体取决于它是单色(或调色板索引)、RGB(红色、绿色、蓝色)还是RGBA(具有用于透明度的Alpha通道的RGB)。

每个像素按顺序存储,从左到右,然后从上到下。第一个像素始终是左上角。下一个像素在第一个像素的右侧,依此类推,直到解析器到达行尾。然后,解析从下一行最左边的像素开始。

每行的开头有一个额外的字节用于筛选器。这用于生成更好的压缩。但是,滤镜与每图像行的字节数或颜色数无关。

就格式而言,PNG几乎是它所能得到的最简单的格式。有定义图像宽度、高度、颜色分量等的标题(IHDR),然后还有压缩光栅像素的IDAT块(一个或多个)。要渲染PNG,需要处理IHDR并分配图像缓冲区,膨胀(解压缩)IDAT数据,然后将像素逐个渲染到图像缓冲区中。大多数PNG图像使用全色。这意味着每个颜色分量1个或2个字节,其中每个分量1个字节是最常见的。虽然这些颜色分量存储为字节,但它们通常按位数表示:8位或16位深度。8位RGB:即每像素3字节。如果图像有1,000个像素宽,那么每行有3,001个字节。(RGB三元组中的3,000个字节加上行过滤器的1个字节。)。

16位RGB:深色图像表示每个分量2个字节,因此每个像素6个字节。由于大多数显示器显示8位深度(如果是移动设备或笔记本电脑,则深度更小),这意味着这些通常是特殊情况下的图片。(不常见。)。

使用8位或16位深度时,每行都不会浪费空间;每个字节都会被使用。但是,PNG也支持较低的位深度。这包括1位(总共2种颜色)、2位(总共4种颜色)和4位(总共16种颜色)。使用这些低位编码选项时,没有颜色。如果需要颜色,请使用调色板(PLTE)并将编码值视为调色板索引。否则,1位为单色(黑白)。2位有黑色、白色和两个灰色。4位使用黑、白和14个灰度级。对于低位深度,每个字节有多个像素。(4位表示每个字节2个像素。2位表示4个像素,1位表示8个像素。)。这是可以进行水平填充的地方。帮助优化压缩的行过滤器本身必须是一个字节。这意味着,即使有些位未使用(填充),每行也必须填充最后一列的字节。1位深度:每种颜色消耗1位。这意味着行中的最后一个字节可以有足够的数据用于最多7个额外的列。

2位深度:行中的最后一个字节最多可以有3个附加列的填充。

4位深度:行中的最后一个字节可以填充1个额外的列。如果图像宽度是奇数,那么您就知道有足够的数据再多一列。

低位PNG图像非常少见。大多数都是具有典型图标宽度的小图标或小部件,如16或32列。这意味着没有额外的数据列(因为宽度均匀地填充到每行的字节数中)。但是,如果您确实遇到过这样的情况,那么您就知道每行可能有额外的隐藏位。FotoForensics的新Hidden Pixels解码器会检查这些潜在的额外列,然后将它们重新添加进去。虽然列填充非常少见,但像素后填充经常用于各种游戏、谜题和挑战。下面是它的工作原理:找到IHDR块。(它应该位于文件开头附近,并且将具有字母";IHDR";。)。

IHDR后的前四个字节是宽度;不要碰它。后四个字节是高度;通过降低此值使其变短。

这里是发生的事情:当你查看图像时,解码器加载IHDR并为指定的宽度和高度分配图像缓冲区。然后,它解码IDAT块并逐行存储像素。当图像缓冲区填满时,解码器停止。虽然解码器已停止,但IDAT缓冲区中仍有未压缩的字节。几乎所有的PNG解码器都会默默地忽略这些未使用的字节。因此,未使用的字节将被忽略填充。PNG底部的消息现在被隐藏,因为修改后的图像高度阻止了它的呈现。FotoForensics的新Hidden Pixels解码器可以检查可用的填充量。如果它足以填充1行或多行像素,则它会相应地增加图像高度。以下是来自公共FotoForensics服务的三个示例。每一个都来自某种使用图像隐写术的地理藏宝或捕获旗帜的挑战。(单击查看FotoForensics的任何图片。)。这里是每个图像在呈现隐藏行后的外观:这些图像中的每一个都包含额外的字节,可以在图片底部呈现为额外的行。这些示例在隐藏行中包含文本、GPS坐标和其他拼图的一部分。如果您想使用这些填充方法来编码数据,有几件事需要牢记:隔行扫描。PNG支持称为Adam7&39;的隔行扫描编码方法。对于非隔行扫描的PNG文件,可以隐藏PNG底部的任意数量的行。在Adam7中,只能隐藏1行,并且它必须是偶数行。否则,隔行扫描图案会移动,图像会损坏。

垂直的。PNG从左到右,然后从上到下存储所有像素。更改PNG的宽度将导致图像倾斜。唯一不是这种情况的情况是低位深度图像,即使这样,也只有有限数量的列(每行位)可以隐藏。

非图像内容。任何数据都可以存储在低位水平填充和最后一个像素的数据之后。如果在最后一个像素的数据之后有足够的额外字节,则隐藏像素分析器将假定这些字节代表更多行。但是,最后一行之后的数据可以用于任何用途,它不需要存储像素数据。(公共FotoForensics服务仅遇到几个额外字节包含非图像内容的实例。)。

新的隐藏像素分析器将尽可能扩展PNG文件,显示任何隐藏的列或行。让游戏开始!