你是否遇到过这些烦恼:
图片太大,卡的是用户,急的是自己。
今天用一段 Python 程序,实现批量图片压缩,体积大幅减小,画质几乎看不出区别。
打开cmd(Win+R,输入cmd,回车),输入以下命令,按回车:
pip install PillowPillow是Python处理图片的利器,可以打开、修改、保存几乎所有常见格式的图片(jpg、png、webp等)。
💡 提示:
Pillow工具安装指定国内镜像网站可加速pip install Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
D: 盘创建新文件夹:ImageTest注意不是移动,是复制,保留原始文件不动D: 盘再新建一个文件夹:ImageTestOut用于存放压缩后的文件。💡 提示:新建文件夹完整路径如下:
D:\ImageTestD:\ImageTestOut
D:盘新建文件夹:python(如果前几期已建,跳过此步)。D:\python文件夹下新建compress_images.py脚本文件,用记事本或其他Python编辑器打开,输入以下代码。完整代码
import osfrom PIL import Imageimport subprocess# 固定路径input_folder = r"D:\ImageTest"output_folder = r"D:\ImageTestOut"quality = 80 # 压缩质量,1-100,推荐75-90# >>> 新增:检测 pngquant 是否可用defis_pngquant_available():try: subprocess.run(["pngquant", "--version"], capture_output=True, check=True)returnTrueexcept (subprocess.CalledProcessError, FileNotFoundError):returnFalsehas_pngquant = is_pngquant_available()if has_pngquant: print("✅ 检测到 pngquant,PNG 图片将获得大幅压缩效果")else: print("⚠️ 未检测到 pngquant,PNG 图片压缩效果有限;如需更好压缩,可安装 pngquant")# <<< 新增结束# 检查存放压缩后图片的目录是否存在——若不存在,则自定创建if not os.path.exists(output_folder): os.makedirs(output_folder) print(f"✅ 已创建输出文件夹:{output_folder}")# 获取所有图片文件(常见格式:.jpg, .jpeg, .png, .webp, .bmp)extensions = ('.jpg', '.jpeg', '.png', '.webp', '.bmp')files = [f for f in os.listdir(input_folder) if f.lower().endswith(extensions)]if not files: print("❌ 文件夹中没有图片文件") input("按回车退出") exit()print(f"找到 {len(files)} 张图片,开始压缩...")for file in files: input_path = os.path.join(input_folder, file) output_path = os.path.join(output_folder, file)# >>> 获取文件扩展名 ext = os.path.splitext(file)[1].lower()try:# >>> 根据格式选择不同压缩策略if ext in ('.jpg', '.jpeg'):# JPEG: 使用 Pillow 质量参数压缩,效果明显with Image.open(input_path) as img:# 转为 RGB 模式(JPEG 不支持透明)if img.mode == 'RGBA': img = img.convert('RGB') img.save(output_path, quality=quality, optimize=True)elif ext == '.png':# >>> PNG 压缩:优先使用 pngquant,否则回退到 Pillowif has_pngquant:# 使用 pngquant 进行有损压缩(大幅减小体积,保留透明通道) temp_output = output_path + ".tmp.png" cmd = ["pngquant", "--quality=65-85", "--force", "--output", temp_output, input_path] subprocess.run(cmd, check=True, capture_output=True) os.replace(temp_output, output_path)else:# 回退到 Pillow 基础压缩(效果有限)with Image.open(input_path) as img:if img.mode == 'RGBA': img.save(output_path, optimize=True)else: img.save(output_path, quality=quality, optimize=True)# <<< PNG 处理结束else:# 其他格式(webp、bmp)使用默认压缩with Image.open(input_path) as img: img.save(output_path, optimize=True)# >>> 统一输出压缩前后大小 original_size = os.path.getsize(input_path) / 1024 new_size = os.path.getsize(output_path) / 1024 print(f"✓ {file}: {original_size:.1f}KB → {new_size:.1f}KB")except Exception as e: print(f"✗ 处理失败:{file},错误:{e}")print(f"\n✅ 压缩完成!压缩后的图片保存在:{output_folder}")input("按回车退出")代码解析
这段代码分为五个模块,逐个分析:
input_folder = r"D:\ImageTest"output_folder = r"D:\ImageTestOut"quality = 80input_folder 存放原始图片,output_folder 存放压缩好的图片。quality = 80 设置压缩质量。对画质要求高(如摄影作品)用90对文件大小敏感(如公众号配图)用75-85即可。💡 提示:
quality取值范围1-100,推荐范围75-90,低于75压缩痕迹显现;高于90质量提升有限,文件体积下降不明显。
ifnot os.path.exists(output_folder): os.makedirs(output_folder)extensions = ('.jpg', '.jpeg', '.png', '.webp', '.bmp')files = [f for f in os.listdir(input_folder) if f.lower().endswith(extensions)]💡 提示:
f.lower()统一小写,避免大小写问题。
for file in files: input_path = os.path.join(input_folder, file) output_path = os.path.join(output_folder, file)# 获取扩展名 ext = os.path.splitext(file)[1].lower() os.path.join 安全地全路径拼接,避免手动加反斜杠出错。os.path.splitext 分离文件名和扩展名,用于判断格式。with Image.open(input_path) as img:if img.mode == 'RGBA': img = img.convert('RGB')RGB(红绿蓝)没有透明通道,图片不透明;RGBA 其中A(Alpha,透明度)支持透明背景。JPEG格式不支持RGBA,此处确保以RGB模式保存JPEG文件。💡提示: 1.
with是Python上下文管理器关键字,用来确保资源被正确释放,即使代码中发生异常也不会泄漏资源。新手谨记: 凡是需要打开外部资源(文件、网络、数据库等)的操作,优先用with。
img.save(output_path, quality=quality, optimize=True)save压缩并保存图片,quality 控制压缩质量,optimize=True 进一步优化文件大小。💡 提示:这一步是整个程序的灵魂,可以理解为,图片压缩一行搞定。
elif ext == '.png':# >>> PNG 压缩:优先使用 pngquant,否则回退到 Pillowif has_pngquant:# 使用 pngquant 进行有损压缩(大幅减小体积,保留透明通道) temp_output = output_path + ".tmp.png" cmd = ["pngquant", "--quality=65-85", "--force", "--output", temp_output, input_path] subprocess.run(cmd, check=True, capture_output=True) os.replace(temp_output, output_path)💡 提示: 此段代码是本文的一大亮点,针对PNG文件升级压缩方式。
Pillow压缩原理是通过丢弃人眼不敏感的色彩细节来大幅减小体积,而PNG为无损压缩,保留所有像素信息,压缩只是优化存储方式,文件大小减小有限。
要想PNG文件也有明显的压缩效果,考虑引入pngquant,对 PNG 进行有损压缩(减少颜色数),但需要额外安装。
本程序若检测到用户已安装pngquant,则进行有损压缩,可大幅减小文件体积(通常减少50%-70%左右),同时保留透明通道;若未安装pngquant则采用Pillow无损压缩。
pngquant安装说明见 第4期:PNG终极瘦身,安装pngquant,让压缩效果翻倍。
original_size = os.path.getsize(input_path) / 1024new_size = os.path.getsize(output_path) / 1024print(f"✓ {file}: {original_size:.1f}KB → {new_size:.1f}KB")os.path.getsize获取文件大小(字节),除以1024转成KB,直观对比压缩效果。打开cmd(Win+R,输入cmd,回车),执行如下命令:
python D:\python\compress_images.py
💡 提示: 看到
“压缩完成”=搞定。 压缩后的图片保存在 D:\ImageTestOut。 按回车退出程序即可


压缩后图片体积明显变小,肉眼几乎看不出画质差别,直接用于公众号、PPT、网站上传都非常丝滑。