图片格式转换

格式简介

1. BMP

2. JPG/JPEG

3. PNG

4. WEBP

5. TIFF

6. ICO

7. TGA

8. HEIF

9. AVIF

10. RAW

转换代码

import os
from PIL import Image
import pillow_heif  # 注册 HEIF 和 AVIF 支持

# pip install pillow pillow-heif
# sudo apt-get install libheif1

def convert_image(input_path, output_path, output_format, quality=None, resize=None):
    """转换单个图像,并可选地调整图像大小"""
    try:
        with Image.open(input_path) as img:
            # 如果指定了调整大小,则进行调整
            if resize:
                img = img.resize(resize)
            
            # 将 RGBA 转换为 RGB(处理 JPEG 格式不支持透明度)
            if img.mode == 'RGBA' and output_format.lower() in ['jpeg', 'jpg']:
                img = img.convert('RGB')

            # 格式映射,确保与 Pillow 兼容
            format_mapping = {
                'jpg': 'JPEG',
                'jpeg': 'JPEG',
                'tif': 'TIFF',
                'tiff': 'TIFF',
                'heif': 'HEIF',
                'heic': 'HEIF',
                'avif': 'AVIF',
            }
            save_format = format_mapping.get(output_format.lower(), output_format.lower())

            # 对于 JPEG 等有损格式,设置质量
            if quality and save_format == 'JPEG':
                img.save(output_path, format=save_format, quality=quality)
            else:
                img.save(output_path, format=save_format)

    except Exception as e:
        print(f"转换 {input_path} 到 {output_path} 时出错: {e}")

def convert_folder(input_folder, output_folder, output_formats, quality=None, resize=None):
    """将文件夹中的所有图像转换为指定格式"""
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for filename in os.listdir(input_folder):
        input_path = os.path.join(input_folder, filename)
        if os.path.isfile(input_path):
            try:
                # 获取文件扩展名,并判断是否为图像文件
                _, ext = os.path.splitext(filename)
                ext = ext.lower().lstrip('.')  # 移除 '.' 并转为小写

                # 支持的图像格式列表(不区分大小写)
                supported_formats = ['bmp', 'jpg', 'jpeg', 'png', 'webp', 'tiff', 'tif', 'ico', 'tga', 'heif', 'avif', 'heic']

                if ext in supported_formats:
                    for output_format in output_formats:
                        # 跳过 RAW 格式的保存
                        if output_format.lower() == 'raw':
                            continue
                        output_path = os.path.join(output_folder, f"{os.path.splitext(filename)[0]}_converted.{output_format.lower()}")
                        convert_image(input_path, output_path, output_format, quality, resize)
                else:
                    print(f"忽略不支持的文件格式: {filename}")

            except Exception as e:
                print(f"处理 {filename} 时出错: {e}")

# 示例用法
input_folder = r'/workspace/Python/1'  # 输入文件夹路径
output_folder = r'/workspace/Python/2'  # 输出文件夹路径
output_formats = ['bmp', 'jpg', 'jpeg', 'png', 'webp', 'tiff', 'tif', 'ico', 'tga', 'heif', 'avif', 'heic', 'raw']  # 13种输出格式
quality = 85  # JPEG 质量(可选)
resize = (800, 600)  # 调整大小(可选)

convert_folder(input_folder, output_folder, output_formats, quality, resize)