如何使用PIL导出带float类型TIFFTAG_DATATYPE标签的TIF图像?
解决用Python保存numpy数组为带TIFFTAG_DATATYPE标签的TIF图像问题
标签ID确认
TIFFTAG_DATATYPE对应的标签ID确实是333,你提到的代码行混淆是因为该标签在Pillow内部的不同引用场景,但ID本身是正确的。
修复Pillow保存报错的方法
你遇到的AttributeError: 'int' object has no attribute 'encode',是因为Pillow对tiffinfo参数中部分标签的格式处理有特殊要求,直接传递整数元组会被误判为字符串类型。以下是两种可行方案:
方案一:调整Pillow的标签传递格式
确保numpy数组本身为浮点类型,同时将标签值改为整数而非元组(TIFFTAG_DATATYPE的类型为SHORT,对应整数格式):
import numpy as np from PIL import Image # 生成/准备float类型的numpy数组 data = np.random.rand(100, 100).astype(np.float32) rawtiff = Image.fromarray(data) # 正确设置标签:值为整数11,无需元组包裹 custom_tags = {333: 11} rawtiff.save('test.tiff', tiffinfo=custom_tags)
如果仍报错,说明Pillow内部限制了该标签的手动设置(图像数据类型通常由Image对象本身自动关联),此时推荐使用更专业的TIFF处理库。
方案二:使用tifffile库(更可靠)
tifffile对TIFF标签的支持更灵活,适合自定义标签场景:
import numpy as np import tifffile # 准备float类型的numpy数组 data = np.random.rand(100, 100).astype(np.float32) # 保存时直接设置自定义标签 tifffile.imwrite( 'test.tiff', data, metadata={333: 11} )
补充说明
TIFFTAG_DATATYPE(333)用于定义自定义数据类型,但通常图像的浮点类型会由numpy数组的类型自动对应。若你必须强制设置该标签为11(对应TIFF的FLOAT类型),上述方案均可实现。
内容的提问来源于stack exchange,提问作者Archura
相关产品推荐
相关产品推荐

