Python批量图片压缩脚本报错KeyError: 'quality'求助
解决批量图片压缩脚本的KeyError: 'quality'问题
错误原因
- 并非所有图片的
img.info字典都包含'quality'键:比如PNG是无损格式,本身不存储质量参数;部分JPG图片也可能未保留该元数据,直接访问会触发KeyError。 - 原脚本逻辑缺陷:保存图片后直接读取原文件大小,但未重新加载修改后的图片,循环中重复使用初始
img对象会导致参数错误,甚至陷入死循环。
修正后的脚本
import os from PIL import Image folder_path = r'C:\Users\alexa\Pictures\MovemberShared\MovemberFinalshoot_Copy' max_size = 5 * 1024 * 1024 # 5MB initial_quality = 85 # 初始质量值,可按需调整 for filename in os.listdir(folder_path): # 过滤目标图片格式 ext = filename.lower() if not ext.endswith(('.jpg', '.jpeg', '.png')): continue filepath = os.path.join(folder_path, filename) # 跳过已符合大小要求的文件 if os.path.getsize(filepath) < max_size: continue current_quality = initial_quality with Image.open(filepath) as img: # 先缩小尺寸(可选,可根据需求调整尺寸参数) img.thumbnail((1000, 1000)) while True: # 保存到临时文件,避免损坏原文件 temp_file = os.path.join(folder_path, f"temp_{filename}") if ext.endswith(('.jpg', '.jpeg')): # JPG格式使用quality参数调整压缩率 img.save(temp_file, optimize=True, quality=current_quality) elif ext.endswith('.png'): # PNG格式使用compress_level适配无损压缩特性(0-9,值越大压缩率越高) img.save(temp_file, optimize=True, compress_level=9 - (current_quality // 10)) # 检查临时文件大小 temp_size = os.path.getsize(temp_file) if temp_size < max_size or current_quality <= 10: # 满足条件则替换原文件,否则停止循环避免质量过低 os.replace(temp_file, filepath) break else: # 降低质量继续尝试 current_quality -= 5 current_quality = max(current_quality, 10)
关键改进说明
- 摆脱对
img.info['quality']的依赖:使用固定初始质量值,通过循环递减调整,兼容所有目标图片格式。 - 分格式适配参数:针对JPG和PNG的压缩特性分别设置参数,保证压缩效果合理。
- 临时文件过渡机制:先保存到临时文件验证大小,再替换原文件,避免操作失误损坏原始图片。
- 循环边界控制:设置最低质量阈值,防止无限循环或生成质量极差的图片。
内容的提问来源于stack exchange,提问作者Alexander van Thiel
相关产品推荐
相关产品推荐

