照片太大发不出去?12 行 Python 批量压缩图片

2026-10-02 · 喵窝资源铺

手机随手一拍就是 3~8MB,一次发几十张到微信直接被限流,给同事传材料邮件附件超限。市面上的"图片压缩大师"要么弹广告要么加水印。这篇给一个 12 行、可直接运行 的 Python 脚本:超宽的等比缩小、PNG 转成 JPG,体积能降一半以上。本文代码实跑验证,真实输出见下。

压缩规则(只压"肥"的部分,画质肉眼看不出差别)

完整脚本

先 pip install pillow,脚本保存为 compress.py,在图片文件夹里运行 python compress.py。注意:会覆盖原文件,重要照片先备份(或把 FOLDER 改成复制一份后的目录):

"""批量压缩图片:超宽缩小 + PNG转JPG。用法:python compress.py [目录]"""
import os, sys
from PIL import Image

FOLDER = sys.argv[1] if len(sys.argv) > 1 else "."
MAX_WIDTH, QUALITY = 1920, 82
changed = 0
for name in os.listdir(FOLDER):
    ext = os.path.splitext(name)[1].lower()
    if ext not in {".jpg", ".jpeg", ".png"} or not os.path.isfile(os.path.join(FOLDER, name)):
        continue
    path = os.path.join(FOLDER, name)
    im = Image.open(path)
    if ext == ".png":                              # PNG照片转JPG
        im.convert("RGB").save(path[:-4] + ".jpg", "JPEG", quality=QUALITY, optimize=True)
        os.remove(path); changed += 1
    elif im.width > MAX_WIDTH:                     # 超宽等比缩小
        im = im.resize((MAX_WIDTH, int(im.height * MAX_WIDTH / im.width)), Image.LANCZOS)
        im.save(path, "JPEG", quality=QUALITY, optimize=True); changed += 1
    # 否则:已合规,跳过(不反复重压缩,避免画质一代代变差)
print(f"压缩了 {changed} 个文件")

实跑结果

我造了 12 张测试图(4 张高清 JPG、4 张 PNG、4 张 100% 质量的 JPG,尺寸 800~4000px 随机),跑一遍的输出:

压缩了 12 个文件
总体积:712904 -> 225489 字节(省了 69%)

12 张全部处理,体积降到原来的 31%。再跑一遍验证:

压缩了 0 个文件

第二次运行 0 个文件被改动——已经合规的图不会被再次压缩。

为什么要"跳过已合规的"?一个容易踩的坑

最直觉的写法是"是图片就压",但 JPEG 是有损格式:每次以 quality=82 重新保存,画质都会再掉一档,文件还会继续变小但越来越糊。如果你隔两天往同一个文件夹丢了新照片又跑一遍脚本,旧照片就被多压了一轮。所以正确逻辑是用条件判断跳过(宽度已达标就不动),而不是记录"处理过没有"的状态文件——少维护一份状态,脚本也更抗折腾。

另一个坑:PNG 转 JPG 后如果只 save 不 os.remove,目录里会同时留着 a.png 和 a.jpg 两份,下次发图容易发错旧的。

参数怎么调

需求改哪里
要更小(比如凑附件限额)QUALITY = 70,或 MAX_WIDTH = 1280
画质优先(打印/二次裁剪)QUALITY = 90,别动宽度
不动原文件先复制整个文件夹再跑,或把输出路径指向新目录

再往上是什么活?

脚本处理的是"一个文件夹里的照片"。如果你要的是「几百个子文件夹递归处理」「按拍摄日期归档后压缩」「压完自动打包发邮箱」——逻辑要再包一层,可以直接找我们代写(见下)。

不想自己跑?我们代做。描述你的图片场景(多大体积、多少张、要压到多大),9.9 元起,AI 编写 + 人工核验交付,24 小时内给出定制脚本 + 使用说明。
⚠️ 虚拟物品一经交付概不退款;未达到承诺效果免费重做。
👉 喵窝资源铺 · 服务清单

相关阅读:乱文件名批量改:30 行 Python · 800 个乱文件自动整理 · 10 分钟清洗脏 Excel