繁体   English   中英

Python PNG解码-霍夫曼编码

[英]Python PNG decoding - Huffman coding

作为作业的一部分,我应该用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,依此类推,直到该行的末尾(没有实际的换行符,而另一行是“ header”字节”)。 0x04或0x02但是,当我阅读时,它们是以霍夫曼编码进行编码的,这是我的问题:

如何解码这些行? 是否有一个python函数(就像在充气步骤中使用zlib解压缩一样)。此外,最后两行以0x01开头,当我读到Deflate时,它的意思是“这是流中的最后一块”。 为什么我在图像的最后两行中都有它,而不仅仅是最后一行? 而且最后两行的数据也令人困惑,因为有些像素显然是以“原始”表示,而有些则不是。

非常感谢您,我已经设法在所有地方找到答案了...

伏塔

Huffman编码是zlib.decompress已为您撤消的deflate压缩的一部分。 根据PNG规范的第4.5.4节 ,每条扫描线的第一个字节为过滤器类型, 第9节中介绍了过滤器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM