【发布时间】:2011-06-04 11:18:21
【问题描述】:
我想写一个 Python 程序来制作 PNG 文件。我的大问题是生成 CRC 和 IDAT 块中的数据。 Python 2.6.4 确实有一个 zlib 模块,但需要额外的设置。 PNG 规范要求使用 zlib 的 deflate 方法压缩 IDAT 数据,窗口大小为 32768 字节,但我找不到如何在 Python zlib 模块中设置这些参数。
对于每个块的 CRC,zlib 模块文档表明它包含一个 CRC 函数。我相信将该 CRC 函数调用为 crc32(data,-1) 将生成我需要的 CRC,但如有必要,我可以翻译 PNG 规范中给出的 C 代码。
请注意,我可以为 IDAT 块生成 PNG 文件的其余部分和 要压缩的数据,我只是不知道如何正确在执行初始过滤步骤后压缩 IDAT 块的图像数据。
编辑:
PyPNG 的问题是它不会写入文本块。一个小烦恼是必须将图像作为(R,G,B)数据进行处理;我更喜欢直接操作像素的调色板值,然后定义调色板值和颜色数据之间的关联。我也不确定 PyPNG 是否利用图像数据中的 1 位、2 位和 4 位调色板值允许的“压缩”来适应一个字节中的多个像素。
【问题讨论】:
-
为什么不使用 PNG 库而不是 zlib 库?
-
正如我在编辑中指出的那样,PyPNG 不会写入文本块。
-
(我是 PyPNG 的维护者)基于调色板的图像不是我经常玩的东西,但 PyPNG 确实对它们提供了非常全面的支持。是的,您可以随心所欲地制作调色板图像,请参阅this example from the documentation(我同意这可能不清楚)。是的,您可以拥有每像素 2 位的调色板图像,这会将 4 个像素打包成一个字节。在创建 png.Writer 实例时只需指定 bitdepth=2 (这不清楚)。当然,这也适用于其他位深度。
-
你是对的,你不能用 PyPNG 添加一个文本块。那是Issue 4,现在我知道有人想要它,我可能很快就会添加这个功能。您愿意共同创建一个好的 API 吗?