用 Python 批量校验商品图片尺寸:Pillow 读图与超标清单实战

举报
yd_295675147 发表于 2026/11/13 19:36:33 2026/11/13
【摘要】 上架前一张张点开图片看尺寸太慢,本文用 Pillow 批量读取主图与详情图的宽高,按平台规则分桶打标:合格、偏小、比例失调、损坏文件,最后输出一份 CSV 超标清单,附可直接运行的代码。

一、先说场景


做亚马逊和独立站上架,图片尺寸是最容易在最后一刻翻车的环节:主图要求长边不小于 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 不会解码全部像素。


五、这件事的通用做法


第一,规则先行:先把合格标准写成文字,再写代码实现,标准变了只改判定函数。


第二,分桶输出:不要只打印通过或不通过,把每一张图的结论、尺寸、模式都落到表格里,复查和分工都有据可查。


第三,损坏单独处理:读图失败和尺寸不合格是两类问题,前者找源文件,后者重出图,混在一起会越处理越乱。


这套脚本我现在每次上架前跑一遍,几百张图一分钟出清单,返工基本都在出图环节拦截掉了,不会等到上传时才发现。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。