商品照片在手机里竖着,进入批量精修后却横着,可能与EXIF方向信息有关。像素矩阵的宽高和查看器显示的方向不一定相同。整理输入时可以先把方向归一,再另存输出,并记录前后尺寸。这里的脚本处理文件方向,不识别商品朝向,也不评价修图效果;没有EXIF依据的照片不能凭物体形状自动旋转。
本例使用Python与Pillow,读取单帧文件,通过ImageOps.exif_transpose按方向信息转换,再保存为PNG。运行环境在本次检查中为Python 3.12.14、Pillow 12.3.0,依赖Pillow需事先安装。官方ImageOps文档说明了EXIF转置方法;下面的局部工具测试不是任何品牌精修系统的产品测试,两种验证应分开记录。
转正时不覆盖原片
输入与输出必须不同,输出文件已经存在时拒绝覆盖。原片还承担商品信息的溯源职责,不能因为方向整理就丢掉。脚本读取后立即解码,遇到损坏文件让异常暴露,而不是继续登记完成。多帧输入在本例中拒绝,避免只处理其中一帧却让员工误以为整个素材已转换;需要动画时应另定契约。
from pathlib import Path
from PIL import Image, ImageOps
def orient(source, target):
source, target=Path(source), Path(target)
if source.resolve()==target.resolve(): raise ValueError(‘refuse to overwrite input’)
if target.exists(): raise FileExistsError(target)
with Image.open(source) as im:
im.load()
if getattr(im,‘n_frames’,1)!=1: raise ValueError(‘single-frame input required’)
before=im.size
result=ImageOps.exif_transpose(im)
result.save(target,format=‘PNG’)
after=result.size
with Image.open(target) as check: check.load()
return {‘input_size’:before,‘output_size’:after,‘output’:str(target)}
函数返回原始像素尺寸与转正后的尺寸,方便任务表记录。尺寸交换不一定意味着错误:若方向信息需要旋转直角,横竖边会交换;如果没有相应方向信息,尺寸可能不变。本例没有保留所有原始元数据的目标,PNG另存用于方向归一的输入副本,色彩管理与摄影原始资料仍需根据项目需求另行处理。
用带方向信息的夹具复现
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as td:
p=Path(td)
img=Image.new(‘RGB’,(30,10),‘red’)
exif=Image.Exif(); exif[274]=6
img.save(p/‘source.jpg’,exif=exif)
assert orient(p/‘source.jpg’,p/‘fixed.png’)[‘output_size’]==(10,30)
try:
orient(p/‘source.jpg’,p/‘source.jpg’)
except ValueError:
print(‘input overwrite refused’)
else:
raise AssertionError(‘expected rejection’)
成功夹具先建立一张横向测试图,把EXIF方向设为需要转置的状态,然后检查输出宽高是否交换。测试图是本地生成的小矩形,不是真实商品照片,因此只验证代码路径与文件结果。它不能说明某个商品拍得正确,也不能检验细节是否清楚,方向处理完成以后仍需要人工观察实际素材。
错误分支分别提交相同输入输出路径,以及已有的输出文件。两者应该拒绝,而不是写出一个看似成功的记录。还可以在自己的环境中增加缺失文件与损坏文件夹具,观察异常类型;批处理时逐文件记录错误,不要因为一张失败就隐藏整批进度,也不要把失败文件放进后续可制作清单。
当前Picset精修页面提供图片上传与精修要求,整理后的文件可以作为这类图像工作流的候选输入。方向归一位于上传前,不是该产品的新增功能。本地脚本无网络请求、不上传图片、不生成图像,也不确认后续精修能达到什么效果;选用工具以后,商品结构与颜色仍需另行验收。
接入批量任务时,输出目录与原始素材目录分开,文件标识保留商品关联。方向记录与来源照片一起留存,员工就能解释哪张经过了转置。不要在发现方向问题后直接修改已经使用的原文件路径,让其他任务不知不觉读取新内容;明确的输入副本更容易检查和回退。
本例只把可解释的方向信息落实到像素,不处理透视、裁切或缺失结构。若照片本身拍歪、主体被遮挡,EXIF转换不会修复这些问题。把工具边界写进任务表,后续流程才能区分文件整理完成与商品素材通过,避免一条技术成功记录被理解成图片已经可以发布。
实际交付前打开输出图,检查方向、画面范围和对应型号,再保留转换记录。自动检查负责文件读写和尺寸,人负责内容与用途。这个小步骤的价值,是让后续编辑面对一致的输入方向,同时不丢掉原片和失败原因;它不是把全部商品图质量问题都变成一次旋转操作。