如何解决PIL.Image调用getdata()方法触发缓冲区溢出的问题
解决方案
升级Pillow及底层依赖库
该报错多数情况是旧版本Pillow依赖的libtiff存在已知缓冲区溢出漏洞,执行以下命令升级到最新稳定版即可:pip install --upgrade pillow如果你使用conda管理环境,改用以下命令:
conda update pillow验证TIFF文件有效性
确认目标.tif文件没有损坏,可先用本地图像查看工具打开验证。如果是多帧、带特殊压缩编码的非常规TIFF文件,改为逐帧读取:from PIL import Image img = Image.open('dddd.tif') # 遍历所有帧读取 for frame_idx in range(img.n_frames): img.seek(frame_idx) frame_data = img.getdata() # 此处添加单帧的处理逻辑适配大文件读取场景
如果你的TIFF文件分辨率极高、体积过大,getdata()一次性加载全量像素会触发内存溢出,改为分块裁剪读取:from PIL import Image img = Image.open('dddd.tif') width, height = img.size # 按1024*1024的块大小拆分读取 block_size = 1024 for x in range(0, width, block_size): for y in range(0, height, block_size): block = img.crop((x, y, min(x+block_size, width), min(y+block_size, height))) block_data = block.getdata() # 此处添加块数据的处理逻辑更换64位Python环境
如果你当前使用的是32位Python,读取超过2GB的TIFF文件会触发地址空间上限导致溢出,更换为64位Python即可解决。
内容的提问来源于stack exchange,提问作者Mohamed Kaab
相关产品推荐
相关产品推荐

