如何PNG文件的IDAT块无压缩

问题描述:

我在Photoshop中创建了一些4×4像素,16位灰度,图像并将其保存为解码非压缩,无交错,PNG文件。我试图编写一个程序来从这些文件中提取图像数据,但我对IDAT块有点困惑。这是为了自我教育的目的,所以我没有使用图书馆。如何PNG文件的IDAT块无压缩

下面是其中每个像素是白色的图像中的一个的IDAT组块中的十六进制码。

hex code

我有颜色编码什么,我相信我在这一点上理解。

红色 =忽略,因为它是IEND块的一部分,与IDAT无关。
黄色 =块信息。前4个黄色字节是数据长度。第二个4个黄色字节是块标识符。图像末尾的最后4个黄色字节是循环冗余校验。
蓝色 = zlib压缩格式信息。第一个蓝色字节是压缩方法和压缩信息。第二个蓝色字节是标志信息。靠近图像底部的最后四个蓝色字节是ADLER-32校验和。我假设在这种情况下没有DICTID。
灰色 = Deflate压缩算法的信息。在第一个灰色字节中,第一位是最后一个块标记,第二位和第三位是编码方法。第一个灰色字节的其余部分被忽略。由于此方法是非压缩方法,因此第二个和第三个灰色字节是块中数据字节的长度,第四个和第五个灰色字节是第二个和第三个灰色字节的补码。
没有框 =与使用用于可能的重复长度的8比特和用于搜索背部距离15位的算法与LZ77的算法(因为未压缩方法没有霍夫曼码)压缩的图像数据。

无论是我的理解不正确的东西或我不理解怎么字节的图像与正确使用LZ77算法没有框进行解码。如果有人能纠正我或显示我不了解,我将不胜感激。谢谢。

+0

添加一些标签......也它看起来像你得到了IDAT黄色的开始/结束小盘正确解码'(大小+ 12个字节)'至少这是我测试的PNG格式相同。 – Spektre

上排:01 FF的fd 00 00 00 00 00 00( “子” 过滤器,第一像素FFFD, 后续像素各自相同的像素其左侧(差值= 0)

剩余3行:02 00 00 00 00 00 00 00 00(“up”过滤器,与上述行相同)

最后一个块:01 00 00 ff ff(最后一个字节标记01,len 0000,〜len ffff)

所以图像是4×4,所有的像素是16位FFFD,这几乎是白色的。

如果您对所有字节都使用了过滤器类型0,则可能会更清楚地理解;行将各自一直00 FF FD FF FD FF FD FF FD

顺便提一下,所述IEND块应具有4个字节(CRC);你的编码器有问题,或者你编辑了十六进制转储的图片。

+0

我编辑了IEND块的其余部分,以及IDAT之前的所有块。我的推理是关注于IDAT。我包括了IEND接下来的证据,以便人们不会质疑是否接下来另一个IDAT组块,或者这是否真的是IDAT组块的结尾。感谢您的答复。 –