作为我家庭作业的一部分,我应该用Python编写一个简单的PNG阅读器。我禁止使用任何与图像一起工作的Python库,因此我应该有一个列表(图像行)的RGB单元像素单元。Python PNG解码 - 霍夫曼编码
解码器应该只读取最基本的PNG图像,它仅包含IHDR,IDAT和IEND块,IDAT仅包含基本的RGB数据。到目前为止,我的程序检查正确的PNG头并用zlib.decompress()解压缩IDAT块。
在这个阶段我被困了好几天。 zlib解码器使图像数据处于该状态,其中我有像这样的图像行的字节表示:
每行都以1字节开头,可以是0x00,0x04,0x02或0x01。我发现0x00意味着该行在“原始数据”中,这意味着下一个字节代表像素的R,G或B等,直到行的末尾(没有实际的换行符,但是其他的“标题字节”)。 0x04或0x02然而,因为我读是在霍夫曼编码编码,这里是我的问题:
如何解码这些行? 是否存在一个python函数(就像膨胀步骤中有zlib解压缩一样)。最后2行以0x01开头,当我读到Deflate时应该表示“这是流中的最后一个块”。为什么我在图像的最后两行有这个,不仅是最后一行?而最后2行的数据也令人困惑,因为有些像素明显处于“原始”表示,但有些不是。
非常感谢你,我试图找到我的答案已经无处不在...
Vojta开发
我刚发现它不是我看到的霍夫曼编码,它是PNG滤波器。我终于找到了从这些行中提取RGB值的方法:http://www.w3.org/TR/PNG/#9Filters –
如果这有帮助,请https://code.google.com/p/pngj /source/browse/pnjg/src/ar/com/hjg/pngj/PngReader.java – leonbloy