python - 如何在 Python 中逐块处理大型 PNG 图像中的 IDATA
问题描述
首先,我想参考问题29513549,所有受访者似乎都同意,PNG 图像格式被设计为具有多个 IDAT 块以用于更大图像的读取和写入是有道理的。这些 IDAT 块包含实际的图像值。
我的问题适用于阅读过程。为了重建这些值,首先需要使用 zlib 解压缩数据,然后应用逆滤波器函数:未压缩的数据尽可能包含与先前值的差异。到目前为止,我只遇到过将所有 IDATA 块连接在一起的示例——例如在Paul Tan的这篇写得很好的博客中——这意味着所有数据都必须加载到内存中。我想这就是为什么 Python 包的文档pypng警告 Reader 类的 read 方法“可能会使用过多的内存”。
我对zlib的解压不是很了解。我知道这里有描述,但看起来很复杂。这是因为 IDAT 块之间的边界是任意的。终止 zlib 检查值很有可能在 IDAT 块之间拆分。尽管如此,我想找到一种方法来解压缩 IDATA 块,而无需同时将所有数据加载到内存中——即使这可能意味着每个块必须被读取两次。如果没有办法做到这一点,那么从 PNG 图像中检索多个 IDAT 块的可能性是没有用的。我期待着你的回答。
解决方案
zlib 流,因此您可以一次简单地将一个 IDAT 块输入 zlib 的充气机,然后将解压后的数据取出。
推荐阅读
- symfony - 在链配置的命名空间 App\Entity [Symfony 5.3][PHPUnit 8.5] 中找不到类 Mock_*
- vue.js - 使用 V-If 和 V-Else 插值数据值?
- flutter - 为什么 Stateful Widget 使用 ChangeNotifier 重建 10 次以上?
- android - 如何在android studio的新表盘中将图像设置为表盘?
- python - 如何在 n 个列表之间获取经常性项目?
- reactjs - React Hooks:动态子项中的独立状态
- sql - 一周的数据总和
- arrays - MongoDb:仅当它包含数组中的所有 id 时才搜索
- swift - 如何调用具有特定大小的视图?
- html - Flex child 将兄弟姐妹推到底部