EXIF只读读取及缺失字段
商品图EXIF整理:只读提取方向与拍摄时间
仓库实拍商品图整理之前,照片的方向与拍摄时间可以做一份只读 EXIF 摘要。它帮助团队发现文件里有没有相关记录,不负责判断照片是否新拍,也不改变图像。本文用 Pillow 读取方向、文件日期与原始日期三个标签,缺失值保留为空。让元数据与视觉资料分别交接,能减少“看到一个日期就以为有拍摄证据”的误解。
Pillow 的 Image.getexif 返回可按标签编号查询的对象[2]。本例只取 Orientation、DateTime 和 DateTimeOriginal,分别使用对应编号。DateTime 与原始拍摄日期不能自动视为同一事实:编辑或导出可能改动记录,文件也可能完全不带这些标签。程序不解析时区、不转换日期,不将标签当成可信的取证结果,只保存读到的内容。
函数接收本地路径,在上下文管理器内打开图像,再查询 EXIF。缺标签返回 None,序列化成 JSON 时可保持 null。这个缺失状态比补上当前时间更准确,当前读取时间不是拍摄时间。代码也不会因为缺方向就写入一个默认编号;后续是否采用默认显示方向,是另一项图像处理决定,不能偷偷混进只读报告。
from PIL import Image
def exif_summary(file):
with Image.open(file) as im:
exif=im.getexif()
return {'orientation':exif.get(274),'datetime':exif.get(306),'original_datetime':exif.get(36867)}
读取异常应与缺失标签分开处理。文件损坏或格式不支持时由调用者记录异常,不能返回全部空值冒充成功;正常文件没有 EXIF 才是空值结果。批次可逐文件捕获错误继续,但本例单函数直接抛出,不写错误占位图。对于多帧图片和特殊格式,本文没有验证全部边界,团队需要按自己允许的输入类型补充条件。
本地验证采用没有 EXIF 的合成 PNG、带方向与日期夹具的 JPEG,以及无法打开的坏文件。日期只是验证查询逻辑的文字,不是任何商品的真实拍摄记录。代码能复现读取路径,不能证明相机来源、文件未被修改或日期真实性。运行版本与检查项已保存,不能把这些结果叫作 Picset 产品测试,二者完全不同。
Picset 产品精修页接收底稿并提供精修要求与背景选择[1],它在仓库照片任务里可以制作新的展示候选。EXIF 读取属于本地资料整理:选择方向正确、来源明确的底稿,再给精修输入。不能由页面存在推断它会保留所有原始元数据,也不能用生成后文件的日期替代原始拍摄日期。需要溯源时把原图单独保存,采用图另有版本。
方向字段也需要结合视觉检查。照片可能已有像素旋转却仍留旧标签,或在导出后去掉标签;本文不根据编号自动旋转,避免重复处理。团队可以打开原图看商品朝向,再决定是否修正,写到新的文件并留记录。这样方向摘要提供线索,真正的展示结果仍由图像观察确认。清晰的 EXIF 报告不是画面正确性的证明。
公开交付通常不需要展示所有元数据。记录拍摄设备、位置等更多信息之前,应判断它们是否确有工作用途,本文只采用少量字段,避免随意扩日志。元数据可以被更改,因此商品来源仍应依靠文件管理、负责人确认与实际资料,不靠一行日期完成全部审查。对于仓库精修,可靠底稿先行,环境和照明处理随后,最后再核主体与资料关系。若拍摄日期需要用于批次选择,让负责人核对原始档案,不自动按字符串排序删除旧照片;缺失日期也应保留待核状态。
参考资料
[1] Picset 当前公开工作室页面