作为我作业的一部分,我应该用Python编写一个简单的PNG阅读器。我被禁止使用任何处理图像的Python库,因此我应该有一个单像素RGB样本列表(图像行)。
解码器应该只读取最基本的PNG图像,这些图像仅由IHDR,IDAT和IEND块组成,IDAT仅包含基本的RGB数据。到目前为止,我的程序检查正确的PNG标头,并使用 zlib.decompress()解压缩IDAT块。
在这个阶段,我被困了几天。 zlib decopress将图像数据保留在状态,其中我有图像行的字节表示,如下所示:
每一行以1字节开头,0x00,0x04,0x02或0x01。我发现0x00意味着该行在“原始数据”中,这意味着下一个字节代表像素的R,G或B,依此类推,直到行的末尾(没有实际的换行但是没有“标题”字节”)。 0x04或0x02但是因为我读的是用霍夫曼编码编码的,这就是我的问题:
如何解码这些行? 是否有一个python函数(就像有膨胀步骤的zlib解压缩)另外,最后2行以0x01开头,我读到的关于Deflate的意思是“这是流中的最后一个块”。为什么我在图像的最后两行中有这个,而不仅仅是最后一行?最后两行的数据也很混乱,因为有些像素显然是“原始”表示,但有些像素不是。
非常感谢,我试图在任何地方找到答案......
Vojta开发
答案 0 :(得分:2)
霍夫曼编码是zlib.decompress
已为您解除的deflate压缩的一部分。根据{{3}},每条扫描线的第一个字节是过滤器类型,过滤器在section 4.5.4 of the PNG spec中描述。
答案 1 :(得分:1)
每行的第一个数据字节不影响压缩:它告诉压缩前数据上运行了哪个预过滤器,它可以是0到4.这在http://www.w3.org/TR/PNG-Filters.html处被描述。顺便说一下,你可以怪我 - 每个扫描线使用不同的滤镜的想法是我的。 : - )