分页: 1 / 1

python批量改变图片大小(没有扩展名自动识别图片类型)

发表于 : 2025-07-07 10:11
rungod

代码: 全选

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🎉 所有图片处理完成!")