高清图片下载后是否完整要处理的不是商品效果,而是一类可以由程序明确判断的输入问题。Pillow的verify用于文件结构检查,完成后重新打开再load触发像素解码,避免只读取文件头便认定图片可交付。
高清图片下载后是否完整要处理的不是商品效果,而是一类可以由程序明确判断的输入问题。Pillow的verify用于文件结构检查,完成后重新打开再load触发像素解码,避免只读取文件头便认定图片可交付。
输入契约与实现
Pillow的verify用于文件结构检查,完成后重新打开再load触发像素解码,避免只读取文件头便认定图片可交付。

代码把图片完整解码限定成小范围任务,刻意不增加网络请求、文件覆盖和发布动作。
运行结果与排错
40×24 PNG完整解码通过;内容不是图片的bad.png返回UnidentifiedImageError。测试没有访问网络,也不接触已有商品文件。
完整解码不等于内容正确,不验证文字、颜色、商品结构或版权。极大尺寸与不可信文件还需要资源隔离,本例保持Pillow默认安全策略。如果要扩大范围,先添加对应失败夹具,再修改实现。
成功分支同样要验证结果含义。
放在图片制作链路的哪里
这个工具适合放在解码工具相关的本地资料整理环节,和图像制作保持解耦。
实际交接至少保留输入版本、代码版本和完整报告。
本例的覆盖范围是:40×24 PNG完整解码通过;内容不是图片的bad.png返回UnidentifiedImageError。测试没有访问网络,也不接触已有商品文件。未覆盖的边界是:完整解码不等于内容正确,不验证文字、颜色、商品结构或版权。极大尺寸与不可信文件还需要资源隔离,本例保持Pillow默认安全策略。
from PIL import Image, UnidentifiedImageError
from tempfile import TemporaryDirectory
from pathlib import Path
import json
def inspect(path):
try:
with Image.open(path) as image:
image.verify()
with Image.open(path) as image:
image.load()
return {'ok': True, 'size': list(image.size), 'format': image.format}
except (OSError, ValueError, UnidentifiedImageError) as exc:
return {'ok': False, 'error_type': type(exc).__name__}
with TemporaryDirectory(dir=Path(__file__).resolve().parent) as folder:
root = Path(folder)
Image.new('RGB', (40, 24), 'green').save(root / 'good.png')
(root / 'bad.png').write_bytes(b'not an image')
success, failure = inspect(root / 'good.png'), inspect(root / 'bad.png')
assert success['ok'] and success['size'] == [40, 24]
assert not failure['ok'] and failure['error_type'] == 'UnidentifiedImageError'
print(json.dumps({'success': success, 'failure': failure}))
编辑复核与下一组测试
下载后的图片验收应把文件能被识别、文件结构能被检查、像素能被解码分开理解。本文先verify,再重新打开并load,重点是避免只读到文件头或取得尺寸就把素材送往排版。40×24 PNG完整解码通过,是这个流程的成功对照;bad.png内容不是图片,返回UnidentifiedImageError,说明扩展名为png并不能让文件获得有效图像内容。遇到这一错误,可先核对交接的是实际图片文件,还是被误存为图片名的其他内容,再回到下载产物查来源;不能通过改后缀或重复读取同一份坏内容解决。报告中的异常名称应与对应文件一起保留,因为接收者需要区分无法识别与后续解码阶段的问题,而不是只得到一项下载失败统计。verify之后重新打开是本例明确安排的两个阶段,不宜把前一阶段通过改写成已经完成像素解码;若未来维护时删掉load,即使原有文件仍可读出宽高,也已经改变了验收范围。下一组测试可在保留有效PNG和非图片bad.png的基础上,加入由有效图片副本构造的截断样本,并分别观察结构检查与像素读取的表现,记录实际异常而不要预设所有坏文件都返回UnidentifiedImageError。还可以让有效文件使用与内容不同的扩展名作为对照,帮助维护者区分名称规则和解码结果;若要支持更多格式,应各自准备有效与受损夹具,不能从一个PNG样例推断全部格式的损坏情况。这个清单最适合放在下载产物交给设计排版或归档之前,先把可完整读取的文件与需要重新获取的文件分开,避免排版人员打开素材时才发现无法使用。通过结果还应按原文件路径回指下载清单,防止同名文件在不同目录中被误认成同一份素材。40×24也提醒编辑,完整解码与高清规格无关,若交付要求特定宽高,应另核对尺寸门槛,不能用可解码替代分辨率验收。对于极大尺寸或不可信文件,保留Pillow默认安全策略,并将资源隔离作为另一个接入条件;不要为了让清单全绿而放松限制。最后的内容审阅仍需打开已通过的图片看文字、颜色和结构,解码报告只证明此次读取流程完成,没有提供这些视觉内容的核对结论。