2013-06-13 120 views
0

作为我家庭作业的一部分,我应该用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开发

+0

我刚发现它不是我看到的霍夫曼编码,它是PNG滤波器。我终于找到了从这些行中提取RGB值的方法:http://www.w3.org/TR/PNG/#9Filters –

+0

如果这有帮助,请https://code.google.com/p/pngj /source/browse/pnjg/src/ar/com/hjg/pngj/PngReader.java – leonbloy

回答

2

霍夫曼编码是deflate压缩是zlib.decompress已经撤销对你的一部分。根据section 4.5.4 of the PNG spec,每条扫描线的第一个字节是过滤器类型,过滤器在section 9中描述。

+0

谢谢,这就是我需要的! : –

+0

@VojtaHejda很高兴听到。如果您通过单击复选标记接受此答案,其他人会看到问题已回答。 –

1

每行数据的第一个字节不影响压缩:它告诉压缩前数据上运行的是哪一个预过滤器,它可以是0到4.这是http://www.w3.org/TR/PNG-Filters.html的缩写。顺便说一句,你可以责怪我 - 每个扫描线使用不同的过滤器的想法是我的。 :-)