本文目录导读:

Python脚本方式(最灵活)
使用PIL/Pillow
from PIL import Image
import os
import glob
def batch_convert(input_folder, output_folder, target_format='PNG'):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 支持的输入格式
formats = ('*.jpg', '*.jpeg', '*.png', '*.bmp', '*.webp')
for fmt in formats:
for img_path in glob.glob(os.path.join(input_folder, fmt)):
# 打开图片
img = Image.open(img_path)
# 生成输出文件名
base_name = os.path.splitext(os.path.basename(img_path))[0]
output_path = os.path.join(output_folder, f"{base_name}.{target_format.lower()}")
# 转换并保存
img.save(output_path, target_format.upper())
print(f"已转换: {img_path} -> {output_path}")
# 使用示例
batch_convert('源文件夹路径', '输出文件夹路径', 'PNG')
使用OpenCV(适合图像处理)
import cv2
import os
import glob
def convert_with_opencv(input_folder, output_folder, target_ext='.png'):
os.makedirs(output_folder, exist_ok=True)
for img_path in glob.glob(os.path.join(input_folder, '*')):
# 读取图片
img = cv2.imread(img_path)
if img is None:
continue
# 生成输出文件名
base_name = os.path.splitext(os.path.basename(img_path))[0]
output_path = os.path.join(output_folder, base_name + target_ext)
# 保存图片
cv2.imwrite(output_path, img)
print(f"转换完成: {base_name}")
# 使用示例
convert_with_opencv('源文件夹', '输出文件夹', '.png')
命令行工具
ImageMagick(功能强大)
# 批量转换JPG到PNG
mogrify -path output_folder -format png *.jpg
# 批量调整大小并转换格式
mogrify -path output_folder -resize 800x600 -format webp *.jpg
# 批量转换所有图片到指定格式
for file in *.jpg; do convert "$file" "${file%.jpg}.png"; done
FFmpeg(适合视频帧转换)
# 批量转换图片序列
ffmpeg -i input_%04d.jpg output_%04d.png
# 批量转换指定格式
for f in *.jpg; do ffmpeg -i "$f" "${f%.jpg}.png"; done
专业软件工具
免费工具推荐:
- XnConvert:跨平台,支持众多格式
- IrfanView(Windows):批量转换 + 多种选项
- GIMP(通过脚本):可批量处理
- 格式工厂:简单易用
在线工具:
- Convertio:在线批量转换
- CloudConvert:支持多种格式
- Zamzar:简单快速的在线转换
高级批量处理脚本
import argparse
from pathlib import Path
from PIL import Image
import concurrent.futures
def convert_image(input_path, output_dir, target_format, quality=95):
"""单个图片转换"""
try:
img = Image.open(input_path)
# 如果是RGBA转RGB(如PNG转JPEG)
if target_format.upper() == 'JPEG' and img.mode in ('RGBA', 'P'):
img = img.convert('RGB')
# 生成输出路径
output_path = output_dir / f"{input_path.stem}.{target_format.lower()}"
# 保存图片
kwargs = {
'format': target_format.upper(),
'quality': quality
}
# 针对不同格式的特殊处理
if target_format.upper() == 'PNG':
kwargs['optimize'] = True
elif target_format.upper() == 'WEBP':
kwargs['lossless'] = False
img.save(output_path, **kwargs)
return f"✓ {input_path.name} -> {output_path.name}"
except Exception as e:
return f"✗ {input_path.name}: {str(e)}"
def batch_converter(input_folder, output_folder, target_format,
recursive=False, max_workers=4):
"""批量图片转换器"""
input_path = Path(input_folder)
output_path = Path(output_folder)
output_path.mkdir(parents=True, exist_ok=True)
# 支持的图片格式
extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.webp', '.tiff'}
# 获取所有图片文件
if recursive:
images = [f for f in input_path.rglob('*') if f.suffix.lower() in extensions]
else:
images = [f for f in input_path.glob('*') if f.suffix.lower() in extensions]
if not images:
print("没有找到图片文件")
return
print(f"找到 {len(images)} 张图片,开始转换...")
# 多线程并行处理
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = [
executor.submit(convert_image, img, output_path, target_format)
for img in images
]
for future in concurrent.futures.as_completed(futures):
result = future.result()
print(result)
# 使用示例
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='图片格式批量转换工具')
parser.add_argument('input', help='输入文件夹路径')
parser.add_argument('output', help='输出文件夹路径')
parser.add_argument('format', help='目标格式 (png, jpg, webp, bmp等)')
parser.add_argument('-r', '--recursive', action='store_true', help='递归处理子文件夹')
parser.add_argument('-w', '--workers', type=int, default=4, help='并行工作线程数')
args = parser.parse_args()
batch_converter(
args.input,
args.output,
args.format,
recursive=args.recursive,
max_workers=args.workers
)
建议与注意事项
格式选择建议:
- PNG:保持透明背景,无损压缩
- JPEG:照片类,文件小但有损
- WebP:现代格式,压缩率高
- GIF:简单动画,256色限制
常见问题解决:
- RGBA转RGB:PNG转JPEG时需处理透明通道
- 色彩模式:CMYK转RGB可能失真
- 文件大小:可通过quality参数控制
性能优化:
- 使用多线程/多进程处理大文件
- SSD硬盘提升IO速度
- 内存足够时使用内存映射
选择哪种方法取决于你的具体需求:
- 简单转换:推荐使用在线工具或专业软件
- 批量自动化:Python脚本最灵活
- 命令行爱好者:ImageMagick功能强大
- 大量图片:考虑使用多线程版本