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,别动宽度 |
| 不动原文件 | 先复制整个文件夹再跑,或把输出路径指向新目录 |
脚本处理的是"一个文件夹里的照片"。如果你要的是「几百个子文件夹递归处理」「按拍摄日期归档后压缩」「压完自动打包发邮箱」——逻辑要再包一层,可以直接找我们代写(见下)。