本文目录导读:

基础安装
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()
使用建议
-
选择合适格式:
- JPEG/JPG:照片类图片,不支持透明背景
- PNG:需要透明背景的图标、Logo等
- WebP:现代格式,压缩率更好
- GIF:简单动画或图标
-
注意事项:
- JPEG格式不支持透明背景,转换前需要处理
- PNG格式文件可能较大
- 建议使用
optimize=True优化文件大小
-
常见错误处理:
# 文件不存在 try: img = Image.open('nonexistent.jpg') except FileNotFoundError: print("文件不存在") # 格式不支持 try: img.save('output.xyz', format='XYZ') except KeyError: print("不支持的格式")
这些示例应该能满足大部分图片格式转换需求。