You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:53:31