十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Pillow 7.2.0 版本解读:TIFF/EXIF API 变更与三项弃用迁移指南

Pillow 7.2.0 版本解读:TIFF/EXIF API 变更与三项弃用迁移指南 图像处理计算机视觉【免费下载链接】PillowPython Imaging Library (fork)项目地址https://gitcode.com/gh_mirrors/pi/Pillow点击查看免费下载本篇技术指南基于当前仓库 docs/releasenotes/7.2.0.rst 展开聚焦 Pillow 7.2.0 发布说明中列出的四类 API 行为变更TIFF 调试日志、EXIF 序列化偏移、Exif 内部 IFD 实现、TIFF BYTE 标签读取与三项弃用Image.show的command参数、Image._showxv、ImageFile.raise_ioerror。读者读完本文后将能够理解这些变更的底层原理并掌握把既有代码平滑迁移到新 API 的具体做法。一、版本定位7.2.0 的变更主线Pillow 7.2.0 的发布说明体量不大但全部集中在两类主题上TIFF/EXIF 数据处理的内部机制统一与行为修正让 EXIF 读写链路从“历史遗留实现”全面切换到与现代 TIFF 插件一致的实现同时修正了默认偏移量等潜在兼容性问题面向未来版本的清理Deprecations为后续大版本移除旧接口做准备给出了明确的替代方案。值得注意的是这些变更大多是行为层面的对大多数日常读写图片的用户来说代码无需改动即可继续工作但对直接解析 EXIF 原始字节、依赖 TIFF 标签返回结构的开发者需要在升级后重新核对返回值类型与序列化结果。二、TiffImagePlugin 调试输出从全局 DEBUG 标志迁移到 logging变更内容旧版本中TiffImagePlugin.DEBUG True被用作打印 TIFF 交互调试信息的开关from PIL import TiffImagePlugin TiffImagePlugin.DEBUG True # 旧写法7.2.0 起已移除7.2.0 起该模块级变量被移除改为使用 Python 标准库logging模块输出调试信息——这也是 Pillow 源码中其他模块如ImageShow、ImageFile等早已采用的方案。底层说明从当前仓库源码看TiffImagePlugin.py 已不再包含DEBUG标志与if DEBUG:分支。迁移后的调试方式与 Python 生态的标准实践一致例如import logging logging.basicConfig(levellogging.DEBUG) from PIL import Image im Image.open(hopper.tif) # TIFF 插件内部的调试日志会经 logging 输出你也可以只针对 Pillow 的 TIFF 相关 logger 单独设置级别避免被其他模块的日志刷屏import logging logging.getLogger(PIL).setLevel(logging.DEBUG)迁移要点任何在代码中设置TiffImagePlugin.DEBUG的写法都需要删除或改写为logging配置依赖该变量读取调试开关的程序逻辑需要整体重构。三、EXIF 序列化Exif.tobytes默认 offset 修正为 8变更内容此前PIL.Image.Exif.tobytes 的默认offset参数为0输出结果不包含 EXIF 的魔数头magic header7.2.0 起默认值修正为8输出会带上bExif\x00\x00前缀与 TIFF 头部。为什么是 8EXIF 数据本质上是嵌入在 JPEG APP1 段中的 TIFF 文件。TIFF 头固定为 8 字节字节序标记II/MM 魔数 首个 IFD 偏移EXIF 还需额外携带 6 字节的Exif\x00\x00标记。从 Image.py 的_get_head实现可以看到头部按字节序拼装为bII\x2a\x00 o32le(8)或bMM\x00\x2a o32be(8)而tobytes最终返回bExif\x00\x00 head ifd.tobytes(offset)——IFD 的绝对偏移需要以头部起点为基准计算默认offset8才能让生成的字节流在被独立解析脱离外部文件指针时保持内部偏移正确。对调用方的影响直接把tobytes()结果拼接进 JPEG APP1 段时现在结果自带完整 EXIF 结构无需再手动补头依赖旧行为返回值不含头部、偏移从 0 计的序列化/反序列化代码需要同步调整解析逻辑传入显式offset的调用不受影响但应确保与最终存放位置的绝对偏移一致。from PIL import Image im Image.open(exif.png) exif im.getexif() data exif.tobytes() # 7.2.0 起默认包含完整头部offset8 assert data.startswith(bExif\x00\x00)四、Exif 内部实现切换从 ImageFileDirectory_v1 迁移到 v2变更内容PIL.Image.Exif内部从遗留的 ImageFileDirectory_v1 迁移到 ImageFileDirectory_v2。最直接的用户可见差异是RATIONAL类型 5与 SIGNED_RATIONAL类型 10标签此前读取结果是(分子, 分母)的二元元组现在读取为PIL.TiffImagePlugin.IFDRational对象。从当前源码确认Image.py 的Exif类 在load、load_from_fp、tobytes中统一使用TiffImagePlugin.ImageFileDirectory_v2构建/解析 IFD不再走 v1 兼容路径ImageFileDirectory_v1仅作为兼容层保留由ImageFileDirectory ImageFileDirectory_v1对外暴露。IFDRational 是什么IFDRational是fractions.Fraction的子类同时支持以分子、分母表示的分数语义。迁移后的读取行为from PIL import Image, ExifTags im Image.open(hopper.tif) exif im.getexif() # 例如 XResolution 标签 (282) value exif.get(ExifTags.Base.XResolution) if value is not None: print(value) # IFDRational(72, 1) 之类 print(value.numerator, value.denominator)迁移要点代码中写numerator, denominator exif[tag]的位置需要改为value.numerator/value.denominator或通过int(value)取得化简后的值由于IFDRational继承自Fraction算术运算如value * 2与比较行为与普通数值基本兼容大多数仅做乘除换算的业务代码可无感升级序列化侧向exif赋值时仍可写入(分子, 分母)元组v2 目录会按 RATIONAL 类型处理。五、TIFF BYTE 标签读取格式修正变更内容TIFF 中BYTE类型 1标签此前被读取为包含一个 bytestring 的元组例如(b\x01\x02,)7.2.0 起直接读取为单个 bytestring即b\x01\x02。底层说明这一修正与 v2 IFD 的加载分发表一致在 TiffImagePlugin.py 中不同类型的标签经由_load_dispatch映射到对应的解码函数。此前 BYTE 类型在 v1 兼容路径下被包裹成单元素元组切换 v2 后按标量处理与其他“单值类型”标签的行为对齐。迁移要点直接索引 BYTE 标签并解包如value[0]的代码需要移除一层解包若确实需要元组形式可自行用(value,)包裹涉及多个 BYTE 值count 1的标签不受影响仍以较长字节串返回。六、弃用项Image.show的command参数变更内容PIL.Image.Image.show 的command参数被标记为弃用将在未来版本移除。官方建议改用PIL.ImageShow.Viewer的子类来自定义查看行为。替代方案Image.show内部调用PIL.ImageShow.show其行为由已注册的Viewer实例链决定。自定义查看器的标准做法是继承Viewer并注册from PIL import ImageShow class MyViewer(ImageShow.Viewer): def show_image(self, image, **options): # 自定义展示逻辑返回 True 表示已处理 return True ImageShow.register(MyViewer(), 0) # 优先级 0优先使用注册后Image.show()会按优先级依次尝试已注册的 viewer不再需要向show()传递command字符串。迁移要点将im.show(command...)的调用改写为注册对应Viewer子类在移除前的过渡期内继续使用command会触发弃用警告DeprecationWarning。七、弃用项Image._showxv变更内容私有方法Image._showxv被弃用官方建议使用公开的Image.show()若需要自定义行为通过ImageShow.register注册自定义Viewer类。_showxv是早期为 X11 窗口系统xv工具保留的实现细节。7.2.0 将其正式标记为弃用意味着后续版本会删除该私有入口。迁移要点直接调用im._showxv(...)的代码改为im.show(...)依赖_showxv特殊行为的场景将逻辑封装进自定义Viewer.show_image后注册即可由于是私有 API任何外部依赖都应尽快清理避免未来版本硬失败。八、弃用项ImageFile.raise_ioerror→raise_oserror变更内容ImageFile.raise_ioerror被弃用理由是IOError自 Python 3.3 起已并入OSError。官方建议改用ImageFile.raise_oserror。底层说明在 Python 3.3 之前IOError与OSError是不同异常类Pillow 为兼容旧 Python 保留了raise_ioerror这一别名式辅助函数。随着 Pillow 全面转向 Python 3保留这个历史名称只会带来困惑——raise_ioerror实际抛出的依然是OSError二者在 Python 3 中是同一类。迁移要点全局替换ImageFile.raise_ioerror为ImageFile.raise_oserror捕获异常处若使用except IOError建议同步改为except OSError语义完全等价且更符合 Python 3 惯例在移除前使用旧名称会触发弃用警告。九、迁移检查清单针对 Pillow 7.2.0 的升级建议按如下清单逐项核查代码库变更类型旧写法新写法TIFF 调试TiffImagePlugin.DEBUG Truelogging.getLogger(PIL).setLevel(logging.DEBUG)EXIF 序列化exif.tobytes()offset0无头exif.tobytes()offset8含Exif\x00\x00头EXIF 有理数n, d exif[tag]v exif[tag]; v.numerator / v.denominatorIFDRationalTIFF BYTE 标签value[0]元组包裹直接使用 bytestringvalue图像展示im.show(command...)/im._showxv()注册ImageShow.Viewer子类后调用im.show()异常辅助ImageFile.raise_ioerrorImageFile.raise_oserror十、验证与测试线索若要在当前仓库中验证上述行为可从以下位置入手EXIF 读写链路Image.py 的Exif类 与 TiffImagePlugin.py 的ImageFileDirectory_v2是两处核心实现tobytesImage.py与_get_headImage.py分别对应偏移修正与头部拼装TIFF 元数据测试Tests/test_file_tiff_metadata.py 覆盖 IFD 读取、RATIONAL/IFDRational 返回类型等行为JPEG/EXIF 测试Tests/test_file_jpeg.py 覆盖 EXIF 解析与 GPS 子 IFD 等场景图像展示模块ImageShow.register与Viewer的实现位于 ImageShow.pyTests/test_imageshow.py 提供注册与调用链的测试参考。结语Pillow 7.2.0 的发布说明虽短却集中体现了项目在“清理历史包袱、统一内部实现”上的两个典型动作一是让 EXIF 链路全面切换到ImageFileDirectory_v2与标准logging修正了序列化偏移与 BYTE 标签返回结构等细节二是用明确的弃用通道为Image.show参数、私有方法与历史异常别名安排退场。对使用者而言本轮变更的迁移成本很低但返回值类型与序列化字节结构的变化值得在升级后通过上述测试用例重新验证一遍尤其是依赖 EXIF 原始字节流或直接解包 RATIONAL 标签的代码。赞分享图像处理计算机视觉【免费下载链接】PillowPython Imaging Library (fork)项目地址https://gitcode.com/gh_mirrors/pi/Pillow点击查看免费下载相关推荐Pillow 11.0.0 迁移指南破坏性变更、弃用项与新特性深度解析Pillow 11.0.0 迁移指南破坏性变更、弃用项与新特性深度解析 导读 Pillow 11.0.0 是 Python Imaging Library 在图像处理计算机视觉Pillow 6.1.0 版本全解析弃用变更、API 新增与底层实现详解Pillow 6.1.0 版本全解析弃用变更、API 新增与底层实现详解 导读 本文以 docs/releasenotes/6.1.0.rst https:/图像处理计算机视觉dokku 0.34.0 迁移指南关键移除、行为变更与弃用项深度解读dokku 0.34.0 迁移指南关键移除、行为变更与弃用项深度解读 导读 本文系统梳理 dokku 0.34.0 版本中引入的破坏性变更Removals云原生DevOps后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表