使用PIL读取自制TIFF图片时触发UnicodeDecodeError问题
解决自制TIFF文件读取的UnicodeDecodeError及保存逻辑问题
一、修复TIFF保存逻辑
你的保存代码存在三个核心问题,导致生成的TIFF文件格式不规范:
- 未以二进制模式打开
.dat文件,文本模式读取二进制数据会破坏内容 numpy.fromfile读取的是一维数组,需恢复为模拟器生成的二维形状- PIL对浮点型TIFF的支持不完善,建议用专业库或转换为标准图像类型
修复后的保存代码
import numpy as np import tifffile # 需先安装:pip install tifffile # 1. 二进制模式读取.dat文件 with open("image.dat", "rb") as f: # 替换dtype和宽高为模拟器实际参数(比如float32,宽W高H) raw_data = np.fromfile(f, dtype=np.float32) # 恢复为二维数组,注意形状顺序为(高度, 宽度) image_array = raw_data.reshape((H, W)) # 2. 用tifffile保存标准浮点TIFF(推荐,支持浮点数组原生存储) tifffile.imwrite("output.tiff", image_array) # 若需兼容普通图片查看器,可转换为uint8类型(需先归一化数值到0-255范围) # image_normalized = (image_array - image_array.min()) / (image_array.max() - image_array.min()) * 255 # image_uint8 = image_normalized.astype(np.uint8) # from PIL import Image # Image.fromarray(image_uint8).save("output_uint8.tiff")
二、解决读取时的UnicodeDecodeError
从报错回溯可以看出,问题出在sif_parser插件——它错误地将你的TIFF文件识别为SIF格式,尝试用UTF-8解码文件头部,导致解码失败。
解决方案1:强制PIL使用TIFF解码器
打开文件时指定格式参数,绕过错误的插件:
import numpy as np from PIL import Image filename = r"C:\Users\cloud-user\Desktop\NonPretentious\test.tiff" # 指定仅用TIFF格式解码器 with Image.open(filename, formats=('TIFF',)) as img: array = np.array(img)
解决方案2:卸载无用的sif_parser插件
如果不需要处理SIF格式文件,直接卸载该插件即可避免冲突:
pip uninstall sif_parser
内容的提问来源于stack exchange,提问作者esquisilo
相关产品推荐
相关产品推荐

