python将指定目录下图片统一转换为指定格式

常用各类软硬件使用技巧、疑难、最新资讯等相关交流
回复
rungod
帖子: 62
注册时间: 2010-06-19 3:51

python将指定目录下图片统一转换为指定格式

帖子 rungod »

代码: 全选

from PIL import Image
import os

def batch_convert_images(input_dir, output_dir, target_format):
    """
    将指定目录下的图片统一转换为指定格式
    :param input_dir: 输入图片目录
    :param output_dir: 输出图片目录
    :param target_format: 目标格式,例如 'JPEG', 'PNG', 'WEBP' (注意:需大写)
    """
    os.makedirs(output_dir, exist_ok=True)
    
    # 支持读取的图片后缀
    valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.webp', '.tiff')
    
    for filename in os.listdir(input_dir):
        if not filename.lower().endswith(valid_extensions):
            continue  # 跳过非图片文件
            
        img_path = os.path.join(input_dir, filename)
        # 将文件名后缀替换为目标格式后缀
        base_name = os.path.splitext(filename)[0]
        ext = '.jpg' if target_format == 'JPEG' else f'.{target_format.lower()}'
        output_path = os.path.join(output_dir, base_name + ext)
        
        try:
            img = Image.open(img_path)
            
            # 【核心处理】如果目标是 JPEG 且原图带有透明通道(RGBA),需先转为 RGB
            # 否则保存 JPEG 时会报错
            if target_format == 'JPEG' and img.mode in ('RGBA', 'LA', 'P'):
                background = Image.new('RGB', img.size, (255, 255, 255))
                if img.mode == 'P':
                    img = img.convert('RGBA')
                background.paste(img, mask=img.split()[-1]) # 将透明部分用白色填充
                img = background
            
            # 执行保存
            img.save(output_path, target_format)
            print(f"✅ 成功转换: {filename} -> {base_name}{ext}")
            
        except Exception as e:
            print(f"❌ 处理 {filename} 时出错: {e}")

# ========== 使用示例 ==========
if __name__ == "__main__":
    input_folder = "./media"        # 替换为你的原图文件夹路径
    output_folder = "./media_o" # 替换为转换后的输出文件夹路径
    
    # 替换为你需要的格式:'JPEG' (jpg), 'PNG', 'WEBP'
    target_fmt = 'JPEG' 
    
    batch_convert_images(input_folder, output_folder, target_fmt)
心海质水
回复