新闻详情

新闻详情

首页 / 资讯中心 / 详情

Pillow 7.1.2 发布说明深度解析:PNG seek 回归修复与 APNG 帧寻址机制

发布时间:2026/10/26 9:41:01来源:尧图网络
Pillow 7.1.2 发布说明深度解析:PNG seek 回归修复与 APNG 帧寻址机制
图像处理计算机视觉【免费下载链接】PillowPython Imaging Library (fork)项目地址https://gitcode.com/gh_mirrors/pi/Pillow点击查看免费下载Pillow 7.1.2 是一次针对性的补丁发布核心任务是修复 7.1.0 引入 APNGAnimated PNG支持时造成的一个回归对普通 PNG 文件调用seek(n)n 0时未能按规范抛出EOFError反而暴露出AttributeError: NoneType object has no attribute read这一令人困惑的错误。本文将结合 docs/releasenotes/7.1.2.rst 的发布说明从帧寻址 API 的契约、PNG 插件的底层实现PngImagePlugin.py与对应测试用例三个层面完整还原该回归的来龙去脉并给出正确的帧遍历与异常处理实践。版本背景7.1.0 为 PNG 插件引入的 APNG 支持要理解 7.1.2 修复的问题必须先回顾其直接上游版本。根据 docs/releasenotes/7.1.0.rst 的记载Pillow 7.1.0 的重大 API 变化之一就是“Improved APNG support”PNG 插件开始支持使用Image.seek方法与ImageSequence.Iterator类读取 APNG 帧序列也支持通过append_images参数写出 APNG 帧序列。这一改动把 PNG 解码器从单一静态图像推进到了多帧序列的模型也意味着seek()的语义需要在普通 PNG 与 APNG 之间统一。而正是在这个统一的边界上7.1.2 发现并修复了一个回归。回归现象seek(1) 抛出了错误的异常类型发布说明中给出的问题描述非常精确When callingseek(n)on a regular PNG wheren 0, it failed to raise an :py:exc:EOFErroras it should have done, resulting in:AttributeError: NoneType object has no attribute read也就是说在 7.1.0 与 7.1.1 中对一张只有一帧的普通 PNG执行from PIL import Image im Image.open(photo.png) im.seek(0) # 正常 im.seek(1) # 应当抛出 EOFError实际却抛出 AttributeErrorseek(1)意味着请求跳到第 2 帧而普通 PNG 并不存在第 2 帧。按序列 API 的契约这里应当抛出EOFError但回归版本中这一异常没有正确上抛程序继续执行后续的读取逻辑此时底层的文件对象已经被解码器关闭指向None于是产生了NoneType object has no attribute read这一极具误导性的错误——它没有告诉用户没有更多帧了而是暴露了内部实现细节。修复内容确保 seek 越界时抛出的正确异常7.1.2 的修复本质上是补上了帧越界时的异常路径使seek(n)n 超出实际帧数恢复为抛出EOFError。这一契约在当前的 PngImageFile.seek 实现 中得到了完整保留与强化def seek(self, frame: int) - None: if not self._seek_check(frame): return if frame self.__frame: self._seek(0, True) last_frame self.__frame try: for f in range(self.__frame 1, frame 1): self._seek(f) except EOFError as e: self.seek(last_frame) msg no more images in APNG file raise EOFError(msg) from e从源码结构看seek()的健壮性由三层逻辑共同保证_seek_check(frame)前置校验若请求帧号与当前状态不匹配则提前返回或拒绝单帧推进模型seek()不会直接跳到任意帧而是从当前帧开始逐帧调用内部的_seek(f)这一步在实现上是线性的也正因如此任何一帧读取失败都能在循环内被捕获EOFError捕获并重新包装内部_seek()抛出的EOFError会被捕获回退到上一帧再以no more images in APNG file为消息重新抛出同一个异常类型保证对调用方的语义始终一致。底层 _seek 的越界判定真正负责发现没有更多帧的是内部方法_seek。它在逐帧扫描 chunk 流时通过两个显式分支判定序列终结遇到IENDchunk 时抛出EOFError(No more images in APNG file)见 src/PIL/PngImagePlugin.py#L953-L955若当前帧扫描完毕后没有任何可用 tile 数据同样抛出EOFError(image not found in APNG frame)见 src/PIL/PngImagePlugin.py#L984-L986。对于一张普通 PNG文件中只有一个IDAT块、一个IEND块。当seek(1)触发第二次帧扫描时IEND分支会立即命中EOFError由此产生。这正是 7.1.2 所保证的now raises the correct exception在源码层面的落点。EOFError 是帧序列 API 的统一契约为什么发布说明强调应当抛出EOFError因为这不仅是PngImageFile的局部约定而是 Pillow 整个帧序列机制共同依赖的协议。Image.seek 的文档契约在 Image.seek 的 docstring 中明确写道If you seek beyond the end of the sequence, the method raises anEOFErrorexception. When a sequence file is opened, the library automatically seeks to frame 0.即EOFError就是已超出序列末尾的官方信号任何遵循序列协议的对象都必须遵守。ImageSequence.Iterator 依赖 EOFError 结束迭代一旦seek()不再可靠地抛出EOFError依赖它的所有高层 API 都会连锁出错。ImageSequence.Iterator 正是这样工作的__getitem__调用im.seek(ix)捕获EOFError后转换为IndexError(end of sequence)见 src/PIL/ImageSequence.py#L46-L52__next__同样依赖EOFError来结束迭代并将其转换为StopIteration见 src/PIL/ImageSequence.py#L57-L64。可以推断如果 7.1.2 没有修复异常类型那么不仅裸调用seek()的用户会看到AttributeError连for frame in ImageSequence.Iterator(im)这类标准遍历方式也可能出现未预期的崩溃或死循环因为迭代终止信号EOFError→StopIteration永远无法被正确触发。从这个意义上说7.1.2 修复的不只是一个异常类型而是整个多帧读取管线的终止语义。测试验证回归被固化在测试套件中Pillow 对这次回归的防护体现在 Tests/test_file_png.py 的test_seek用例中见 Tests/test_file_png.py#L874-L879def test_seek(self) - None: with Image.open(TEST_PNG_FILE) as im: im.seek(0) with pytest.raises(EOFError): im.seek(1)这段测试的行为与发布说明的描述一一对应im.seek(0)必须成功——回退到第 0 帧永远合法im.seek(1)必须抛出EOFError——对单帧 PNG 请求第 2 帧是非法的且错误类型必须正确。该用例直接守护了 7.1.2 的修复内容任何未来改动若再次破坏异常语义都会在 CI 中被立即拦截。此外测试文件中还有一个辅助函数get_chunks用PngStream手工解析 chunk 并以EOFError作为解析终止信号从侧面印证了EOFError在 PNG 解析路径中的流结束语义。实践建议如何健壮地遍历 PNG/APNG 帧基于上述源码与契约在实际项目中处理 PNG/APNG 帧时建议遵循以下模式1. 用 ImageSequence 做遍历自动处理终止from PIL import Image, ImageSequence with Image.open(animation.png) as im: for i, frame in enumerate(ImageSequence.Iterator(im)): # 对 APNG逐帧处理对普通 PNG仅一帧 print(fframe {i}: {frame.size})Iterator在内部捕获EOFError并转换为StopIteration普通 PNG 与 APNG 可以共用同一套代码无需自行判断帧数。2. 手动 seek 时必须捕获 EOFErrorfrom PIL import Image with Image.open(photo.png) as im: im.seek(0) try: im.seek(1) except EOFError: print(no more frames) # 正确、可控的终止信号如果你的代码此前依赖seek 越界会抛某种异常来终止循环请务必按EOFError处理——这是 7.1.2 之后的稳定契约也是ImageSequence内部依赖的信号。3. 判断是否为动画可借助 n_frames / is_animatedPNG 插件在_open()末尾设置了self.n_frames self.png.im_n_frames or 1与self.is_animated self.n_frames 1见 src/PIL/PngImagePlugin.py#L833-L854读取动画帧前可以先检查这些属性减少对异常流程的依赖。小结Pillow 7.1.2 的发布说明虽然简短但修复意义明确它把 7.1.0 引入 APNG 支持时被打破的seek()异常契约重新立了起来——对普通 PNG 越界seek(n)n 0必须抛出EOFError而不是泄露内部实现细节的AttributeError。这一修复不仅让seek()本身行为正确更保障了ImageSequence.Iterator等高层遍历 API 的终止语义。对于仍在 7.1.0/7.1.1 上遇到NoneType object has no attribute read异常的用户升级到 7.1.2 即可解决问题而对于需要自行实现帧遍历逻辑的开发者应始终以EOFError作为没有更多帧的唯一正确信号。赞分享图像处理计算机视觉【免费下载链接】PillowPython Imaging Library (fork)项目地址https://gitcode.com/gh_mirrors/pi/Pillow点击查看免费下载相关推荐Pillow 7.1.1 回归修复解析APNG 支持引入的 PNG seek/tell 崩溃与根治方案Pillow 7.1.1 回归修复解析APNG 支持引入的 PNG seek / tell 崩溃与根治方案 导读 Pillow 7.1.0 在引入 APNG图像处理计算机视觉从 8.3.2 版本发布说明看 Pillow 的安全修复与回归修复实践从 8.3.2 版本发布说明看 Pillow 的安全修复与回归修复实践 Pillow 8.3.2 是一个以安全修复为核心的小版本重点修复了 ImageColo图像处理计算机视觉pandas 1.3.2 发布说明深度解析回归修复、Bug 修复与升级迁移指南pandas 1.3.2 发布说明深度解析回归修复、Bug 修复与升级迁移指南 导读 本文基于 pandas 官方发布说明 doc/source/whatsn数据分析数据科学数据处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/10/25 3:20:41

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/10/25 3:43:49

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/10/25 4:02:17

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/10/25 5:03:13

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/10/25 3:54:32

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/10/25 5:32:24

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉