用 Python 批量校验商品图片尺寸:Pillow 读图与超标清单实战
一、先说场景
做亚马逊和独立站上架,图片尺寸是最容易在最后一刻翻车的环节:主图要求长边不小于 1000 像素、最好是正方形;详情图宽度不够会糊;还有个别从供应商处拿到的图本身就是损坏的,传上去才报错。
人工一张张点开看属性,几十款、每款十几张图的时候根本看不过来。这件事交给脚本做最合适:规则是死的,图是多的,正好批量处理。
二、规则先定死
动手写代码之前,先把判定规则写下来,免得边写边改:
第一,主图:长边小于 1000 像素判偏小;长宽比偏离 1:1 超过 5% 判比例失调。
第二,详情图:宽度小于 750 像素判偏小。
第三,文件本身:打不开、读一半报错的判损坏,不管尺寸。
第四,模式:非 RGB 的图(比如 CMYK 的 JPG、带透明通道的 PNG)单独标出来,因为有些平台上传后颜色会变。
规则定死之后,代码只负责执行,不做判断,出了问题也好回溯。
三、核心代码
只用 Pillow 一个库。先装好:
pip install Pillow
然后按这个思路写:
from PIL import Image
from pathlib import Path
import csv
def check_one(path):
try:
with Image.open(path) as im:
im.verify()
with Image.open(path) as im:
w, h = im.size
mode = im.mode
except Exception as e:
return ('损坏', 0, 0, '', str(e)[:60])
return ('待判定', w, h, mode, '')
注意这里 open 了两次:第一次 verify 只校验文件结构不解码,速度快,损坏文件在这里就拦住了;第二次才真正读尺寸和模式。verify 之后图片对象不能再用,所以要重新 open。
判定函数单独写:
def judge(kind, w, h, mode):
if kind == '主图':
if max(w, h) < 1000:
return '偏小'
ratio = max(w, h) / min(w, h)
if ratio > 1.05:
return '比例失调'
else:
if w < 750:
return '偏小'
if mode not in ('RGB', 'RGBA'):
return '模式异常'
return '合格'
主目录按款号分文件夹时,用文件夹名判断主图还是详情图,比如文件夹名含「主图」的走主图规则,其余走详情图规则。
最后把结果写进 CSV:
rows = []
for p in Path('商品图').rglob('*.[jJ][pP][gG]'):
status, w, h, mode, err = check_one(p)
if status == '损坏':
rows.append([str(p), '损坏', w, h, mode, err])
continue
kind = '主图' if '主图' in str(p) else '详情图'
rows.append([str(p), judge(kind, w, h, mode), w, h, mode, ''])
with open('尺寸校验清单.csv', 'w', newline='', encoding='utf-8-sig') as f:
wtr = csv.writer(f)
wtr.writerow(['文件', '结论', '宽', '高', '模式', '备注'])
wtr.writerows(rows)
跑完之后直接打开 CSV,按结论筛选,偏小和比例失调的拿去重出图,损坏的找供应商重发,合格的不用再看。
四、三个容易踩的坑
第一个坑是拿文件大小当尺寸。文件大小和像素尺寸没有固定关系,一张纯色大图可能只有几十 KB,一张细节丰富的图几百 KB 只看字节数判断会全错,必须读图片头里的宽高。
第二个坑是 EXIF 方向。手机拍的图经常带旋转标记,Pillow 读到的宽高是存储方向的,未必是显示方向。校验之前先用 ImageOps.exif_transpose 转正,否则一张竖图会被误判成横图。
第三个坑是大图内存。详情长图有的上万像素高,一次性全读进内存再处理会很慢。只做尺寸校验时不要 load 像素数据,读 size 和 mode 就够了,Image.open 本身是懒加载,不调 load 不会解码全部像素。
五、这件事的通用做法
第一,规则先行:先把合格标准写成文字,再写代码实现,标准变了只改判定函数。
第二,分桶输出:不要只打印通过或不通过,把每一张图的结论、尺寸、模式都落到表格里,复查和分工都有据可查。
第三,损坏单独处理:读图失败和尺寸不合格是两类问题,前者找源文件,后者重出图,混在一起会越处理越乱。
这套脚本我现在每次上架前跑一遍,几百张图一分钟出清单,返工基本都在出图环节拦截掉了,不会等到上传时才发现。
- 点赞
- 收藏
- 关注作者
评论(0)