本文目录导读:

基础安装
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("不支持的格式")
这些示例应该能满足大部分图片格式转换需求。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播