Python图片格式转换案例如何转换图片格式

wen python案例 27

本文目录导读:

Python图片格式转换案例如何转换图片格式

  1. 基础安装
  2. 单张图片格式转换
  3. 批量图片格式转换
  4. 带质量参数的格式转换
  5. 完整转换工具函数
  6. 命令行工具版本
  7. 使用建议

基础安装

pip install Pillow

单张图片格式转换

from PIL import Image
import os
def convert_image_format(input_path, output_path, output_format):
    """
    转换单张图片格式
    :param input_path: 输入图片路径
    :param output_path: 输出图片路径
    :param output_format: 输出格式(如 'JPEG', 'PNG', 'GIF', 'BMP', 'WEBP')
    """
    try:
        # 打开图片
        img = Image.open(input_path)
        # 转换并保存
        # 注意:JPEG格式不支持RGBA模式,需要转换为RGB
        if output_format.upper() == 'JPEG' and img.mode == 'RGBA':
            # 创建白色背景
            background = Image.new('RGB', img.size, (255, 255, 255))
            # 将RGBA图片粘贴到白色背景上
            background.paste(img, mask=img.split()[3])  # 使用alpha通道作为mask
            background.save(output_path, format='JPEG')
        else:
            img.save(output_path, format=output_format)
        print(f"转换成功: {input_path} -> {output_path}")
    except Exception as e:
        print(f"转换失败: {e}")
# 使用示例
convert_image_format('input.png', 'output.jpg', 'JPEG')
convert_image_format('input.jpg', 'output.png', 'PNG')

批量图片格式转换

from PIL import Image
import os
import glob
def batch_convert_images(input_dir, output_dir, input_format, output_format):
    """
    批量转换图片格式
    :param input_dir: 输入目录
    :param output_dir: 输出目录
    :param input_format: 输入格式
    :param output_format: 输出格式
    """
    # 创建输出目录
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    # 获取所有指定格式的图片
    pattern = os.path.join(input_dir, f'*.{input_format}')
    images = glob.glob(pattern)
    for image_path in images:
        try:
            # 获取文件名(不含扩展名)
            filename = os.path.basename(image_path)
            name_without_ext = os.path.splitext(filename)[0]
            # 构建输出路径
            output_path = os.path.join(output_dir, f'{name_without_ext}.{output_format.lower()}')
            # 转换格式
            img = Image.open(image_path)
            # 处理JPEG格式的RGBA问题
            if output_format.upper() == 'JPEG' and img.mode == 'RGBA':
                background = Image.new('RGB', img.size, (255, 255, 255))
                background.paste(img, mask=img.split()[3])
                background.save(output_path, format='JPEG')
            else:
                img.save(output_path, format=output_format)
            print(f"已转换: {filename} -> {os.path.basename(output_path)}")
        except Exception as e:
            print(f"转换失败 {image_path}: {e}")
# 使用示例
batch_convert_images('images/', 'converted/', 'png', 'jpeg')

带质量参数的格式转换

from PIL import Image
def convert_with_quality(input_path, output_path, output_format, quality=85):
    """
    带质量参数的图片格式转换
    :param quality: JPEG/WebP质量 (1-100)
    """
    try:
        img = Image.open(input_path)
        # 保存时指定质量参数
        img.save(output_path, format=output_format, quality=quality, optimize=True)
        print(f"转换完成 (质量: {quality})")
    except Exception as e:
        print(f"转换失败: {e}")
# 使用示例
convert_with_quality('input.png', 'output.jpg', 'JPEG', quality=90)
convert_with_quality('input.jpg', 'output.webp', 'WEBP', quality=80)

完整转换工具函数

from PIL import Image
import os
def image_format_converter(input_path, output_path, output_format=None, **kwargs):
    """
    通用的图片格式转换函数
    :param input_path: 输入路径
    :param output_path: 输出路径
    :param output_format: 输出格式(自动从扩展名识别)
    :param kwargs: 其他参数 (quality, optimize, progressive等)
    """
    try:
        # 如果未指定输出格式,从输出文件扩展名识别
        if output_format is None:
            output_format = os.path.splitext(output_path)[1].lower().lstrip('.')
        # 打开图片
        img = Image.open(input_path)
        print(f"原始图片: {img.format}, 模式: {img.mode}, 尺寸: {img.size}")
        # 格式转换处理
        output_format_upper = output_format.upper()
        # 处理特殊格式转换
        if output_format_upper == 'JPEG' and img.mode in ('RGBA', 'P'):
            print("JPEG不支持透明度,转换为RGB...")
            if img.mode == 'P':
                img = img.convert('RGBA')
            background = Image.new('RGB', img.size, (255, 255, 255))
            background.paste(img, mask=img.split()[3])
            img = background
        elif output_format_upper == 'PNG' and img.mode == 'CMYK':
            print("PNG不支持CMYK,转换为RGB...")
            img = img.convert('RGB')
        elif output_format_upper in ('WEBP', 'JPEG', 'PNG'):
            pass
        # 保存图片
        img.save(output_path, format=output_format_upper, **kwargs)
        print(f"转换成功: {input_path} -> {output_path}")
        return True
    except Exception as e:
        print(f"转换失败: {e}")
        return False
# 使用示例
image_format_converter('input.png', 'output.jpg', quality=95, optimize=True)
image_format_converter('input.jpg', 'output.webp', quality=80)
image_format_converter('input.gif', 'output.png')

命令行工具版本

#!/usr/bin/env python3
import argparse
from PIL import Image
import os
def main():
    parser = argparse.ArgumentParser(description='图片格式转换工具')
    parser.add_argument('input', help='输入图片路径')
    parser.add_argument('output', help='输出图片路径')
    parser.add_argument('--format', help='输出格式 (如 JPEG, PNG, WEBP)')
    parser.add_argument('--quality', type=int, default=85, help='图片质量 (1-100)')
    parser.add_argument('--optimize', action='store_true', help='优化图片')
    args = parser.parse_args()
    # 调用转换函数
    image_format_converter(
        args.input, 
        args.output, 
        output_format=args.format,
        quality=args.quality,
        optimize=args.optimize
    )
if __name__ == '__main__':
    main()

使用建议

  1. 选择合适格式

    • JPEG/JPG:照片类图片,不支持透明背景
    • PNG:需要透明背景的图标、Logo等
    • WebP:现代格式,压缩率更好
    • GIF:简单动画或图标
  2. 注意事项

    • JPEG格式不支持透明背景,转换前需要处理
    • PNG格式文件可能较大
    • 建议使用 optimize=True 优化文件大小
  3. 常见错误处理

    # 文件不存在
    try:
        img = Image.open('nonexistent.jpg')
    except FileNotFoundError:
        print("文件不存在")
    # 格式不支持
    try:
        img.save('output.xyz', format='XYZ')
    except KeyError:
        print("不支持的格式")

这些示例应该能满足大部分图片格式转换需求。

抱歉,评论功能暂时关闭!