如何写图片格式批量转换

wen 实用脚本 30

本文目录导读:

如何写图片格式批量转换

  1. Python脚本方式(最灵活)
  2. 命令行工具
  3. 专业软件工具
  4. 高级批量处理脚本
  5. 建议与注意事项

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色限制

常见问题解决:

  1. RGBA转RGB:PNG转JPEG时需处理透明通道
  2. 色彩模式:CMYK转RGB可能失真
  3. 文件大小:可通过quality参数控制

性能优化:

  • 使用多线程/多进程处理大文件
  • SSD硬盘提升IO速度
  • 内存足够时使用内存映射

选择哪种方法取决于你的具体需求:

  • 简单转换:推荐使用在线工具或专业软件
  • 批量自动化:Python脚本最灵活
  • 命令行爱好者:ImageMagick功能强大
  • 大量图片:考虑使用多线程版本

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