首页 > 解决方案 > 如何在 Python 中逐块处理大型 PNG 图像中的 IDATA

问题描述

首先,我想参考问题29513549,所有受访者似乎都同意,PNG 图像格式被设计为具有多个 IDAT 块以用于更大图像的读取和写入是有道理的。这些 IDAT 块包含实际的图像值。
我的问题适用于阅读过程。为了重建这些值,首先需要使用 zlib 解压缩数据,然后应用逆滤波器函数:未压缩的数据尽可能包含与先前值的差异。到目前为止,我只遇到过将所有 IDATA 块连接在一起的示例——例如在Paul Tan的这篇写得很好的博客中——这意味着所有数据都必须加载到内存中。我想这就是为什么 Python 包的文档pypng警告 Reader 类的 read 方法“可能会使用过多的内存”。
我对zlib的解压不是很了解。我知道这里有描述,但看起来很复杂。这是因为 IDAT 块之间的边界是任意的。终止 zlib 检查值很有可能在 IDAT 块之间拆分。尽管如此,我想找到一种方法来解压缩 IDATA 块,而无需同时将所有数据加载到内存中——即使这可能意味着每个块必须被读取两次。如果没有办法做到这一点,那么从 PNG 图像中检索多个 IDAT 块的可能性是没有用的。我期待着你的回答。

标签: pythonmemory-managementpngzlibpypng

解决方案


zlib 流,因此您可以一次简单地将一个 IDAT 块输入 zlib 的充气机,然后将解压后的数据取出。


推荐阅读