【发布时间】:2023-12-03 10:55:02
【问题描述】:
首先,我想参考问题29513549,所有受访者似乎都同意,PNG 图像格式被设计为具有多个 IDAT 块以防更大的图像是有道理的 - 用于阅读和写作。这些 IDAT 块包含实际的图像值。
我的问题适用于阅读过程。为了重建这些值,首先需要使用 zlib 解压缩数据,然后应用反向过滤函数:未压缩的数据包含与先前值的差异,如果可能的话。到目前为止,我只遇到过将所有 IDATA 块连接在一起的示例——例如在Paul Tan 这个写得很好的博客中——这意味着所有数据都必须加载到内存中。我想这就是为什么 Python 包 pypng 的文档会警告 Reader 类的读取方法“可能使用过多内存”的原因。
我对zlib的解压不是很了解。我知道它被描述为here,但看起来很复杂。这是例如因为 IDAT 块之间的边界是任意的。终止 zlib 检查值很有可能在 IDAT 块之间拆分。同样,我想找到一种方法来解压缩 IDATA 块,而无需同时将所有数据加载到内存中——即使这可能意味着每个块必须被读取两次。如果没有办法做到这一点,那么从 PNG 图像中检索多个 IDAT 块的可能性是没有用的。我期待着您的回答。
【问题讨论】:
-
它主要是对编码器的优化:它不会为编写良好的解码器提供任何好处,它根本不应该关心块边界。
zlibstdlib 模块可以对数据流进行操作。创建一个流,获取zlib以开始解压缩流,然后在从磁盘或网络读取数据时传递IDAT数据。没有理由一次将一个块的图像数据通过管道传输到流中:只需在获取时通过管道传输即可。
标签: python memory-management png zlib pypng