PIL保存大尺寸uint32类型TIFF图片报‘L’ format错误的解决方法
问题原因
报错本质是经典TIFF格式的32位偏移量限制。经典TIFF用32位无符号整数存储文件内数据偏移,最大支持4GB的文件大小。你的38000×38000 uint32图像总字节数为:38000 * 38000 * 4 = 5,776,000,000 字节(约5.7GB),超过了32位无符号整数的最大值(4,294,967,295字节),导致PIL在计算数据偏移时溢出,触发struct.error。
30000×30000的图像总大小为3.6GB,未超过4GB阈值,所以能正常保存。
解决方案
直接使用BigTIFF格式保存,它支持64位偏移量,可处理远超4GB的文件。Pillow(PIL的分支)从较新版本开始支持BigTIFF,只需在save时指定格式参数:
修改后的代码
import numpy from PIL import Image resLabels = numpy.ndarray(shape=(38000, 38000), dtype=numpy.int32) resLabels.fill(0) resLabels[0,0] = 10000000 arr = resLabels.astype("uint32") im = Image.fromarray(arr) # 指定保存为BigTIFF格式 im.save("Test.tif", format="TIFF", bigtiff=True)
额外注意事项
- 确保你的Pillow版本≥9.1.0(更早版本对BigTIFF支持不完善),可通过
pip install --upgrade pillow升级。 - 打开BigTIFF文件需要支持该格式的工具(如ImageMagick、GIMP 2.10+或最新版Photoshop),部分旧图像查看器可能不兼容。
内容的提问来源于stack exchange,提问作者FiReTiTi
相关产品推荐
相关产品推荐

