在Python中如何逐块处理大型PNG图像的IDATA数据
可行方案说明
完全可以实现无需一次性加载所有IDAT块的流式读取方案,这也是PNG多IDAT块设计的核心价值之一,具体实现逻辑如下:
- zlib本身原生支持流式增量解压缩,不需要一次性输入所有压缩数据。你只需要按PNG文件中IDAT块的先后顺序,逐个读取每个IDAT块的纯数据段(剔除块长度、类型、CRC校验的头尾字段),依次喂给zlib的解压缩上下文对象即可,IDAT块的边界不会对解压缩逻辑产生任何影响,哪怕zlib的头部、压缩内容、终止校验值被拆分在不同IDAT块中也能正常处理。
- 解压缩后的逆滤波操作也支持流式执行,不需要等全量数据解压完成。PNG的行滤波规则仅依赖当前行原始数据和上一行已经完成逆滤波的结果,你可以每解压出一行完整数据就执行一次逆滤波,处理完成后即可输出或写入磁盘,仅需要缓存上一行的处理结果,内存占用仅和图像单行的像素长度挂钩,和图像总分辨率无关。
- 如果使用Python的pypng库,不需要调用会全量加载的
read()方法,直接使用Reader类的iter_rows()方法即可实现流式逐行读取,内部已经实现了增量解压缩和逐行逆滤波的逻辑,不会占用过量内存。 - 现有示例中拼接所有IDAT块的操作仅为了简化小图场景的实现逻辑,并非PNG读取的必要步骤。
内容的提问来源于stack exchange,提问作者Dobedani
相关产品推荐
相关产品推荐

