使用Pillow将Mode 1格式多帧TIFF转换为RGB格式多帧TIFF时仅保存单帧的问题排查
问题分析与解决
嘿,你遇到的问题根源很明确——你的代码只处理了多帧TIFF的第一帧,压根没遍历处理剩下的所有帧!
PIL库的Image.open()默认只会加载多帧TIFF的第一页,你直接对它做convert('RGB'),得到的也只是单帧的RGB图像,哪怕加了save_all=True,也只有这一帧能被保存下来。
修正后的代码
from PIL import Image def convert_multiframe_tiff(file_path='test.tiff'): rgb_frames = [] with Image.open(file_path) as img: try: while True: # 对当前帧进行RGB转换 rgb_frame = img.convert('RGB') rgb_frames.append(rgb_frame) # 切换到下一帧,直到抛出EOFError表示所有帧处理完毕 img.seek(img.tell() + 1) except EOFError: pass # 所有帧处理完成 # 保存所有RGB帧到新的多帧TIFF if rgb_frames: rgb_frames[0].save( fp='new.tiff', format="TIFF", save_all=True, append_images=rgb_frames[1:], # 把剩下的帧追加进去 compression="None" ) return
关键修正点
- 用
seek()和tell()方法遍历多帧TIFF的每一页,直到触发EOFError(这是PIL处理多帧图像的标准方式) - 把每帧转换后的RGB图像存入列表,最后统一保存
- 保存时通过
append_images参数传入除第一帧外的所有帧,配合save_all=True实现多帧保存
额外小贴士
- 可以先打印
img.n_frames确认原TIFF的总帧数,验证是否真的是多帧文件 - 如果原TIFF有自定义元数据,可能需要额外处理来保留这些信息(默认保存会丢失部分非标准元数据)
内容的提问来源于stack exchange,提问作者ron_g
相关产品推荐
相关产品推荐

