代码: 全选
from PIL import Image
import os
# 设置路径(请根据需要修改)
input_folder = './pic_t' # 输入目录(原始图片所在)
output_folder = './compressed' # 输出目录(压缩后保存位置)
# 参数设置
target_size_kb = 1024 # 目标最大文件大小(单位 KB)
max_width = 1920 # 最大宽度(像素),超过则等比缩放
quality_initial = 85 # 初始 JPEG 压缩质量(85 是高质量)
quality_fallback = 70 # 如果仍太大,使用更低质量
image_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp'] # 支持的格式
# 创建输出目录(如果不存在)
os.makedirs(output_folder, exist_ok=True)
def compress_image(img_path, output_path):
with Image.open(img_path) as img:
img_format = img.format # 保留原始格式(如 PNG、JPEG)
# 如果是透明图层(PNG),转为 RGB 并去掉透明通道
if img.mode in ("RGBA", "P") and img_format == 'PNG':
img = img.convert("RGB")
# 如果图像宽度超过限制,按比例缩放
if img.width > max_width:
ratio = max_width / img.width
new_height = int(img.height * ratio)
img = img.resize((max_width, new_height), Image.LANCZOS)
print(f" → 已缩放至 {max_width}x{new_height}")
# 先尝试用高质量保存一次
img.save(output_path, format='JPEG', optimize=True, quality=quality_initial, exif=b'')
print(f" → 初次压缩完成,质量 {quality_initial}")
# 如果仍大于目标大小,再次压缩
if os.path.getsize(output_path) > target_size_kb * 1024:
print(f"⚠️ 文件仍大于 {target_size_kb}KB,尝试二次压缩...")
img.save(output_path, format='JPEG', optimize=True, quality=quality_fallback, exif=b'')
print(f" → 二次压缩完成,质量 {quality_fallback}")
print(f"✅ 已保存: {output_path}")
# 批量处理图片
for filename in os.listdir(input_folder):
file_ext = os.path.splitext(filename)[1].lower()
if file_ext in image_extensions:
input_path = os.path.join(input_folder, filename)
output_name = filename.rsplit('.', 1)[0] + ".jpg" # 强制统一为 .jpg
output_path = os.path.join(output_folder, output_name)
print(f"\n处理文件: {filename}")
compress_image(input_path, output_path)
print("\n🎉 所有图片处理完成!")