Webサイトの画像最適化や統一的なファイル形式への変換作業で、複数の画像を一度にjpg形式に変換したいケースがありますよね。手作業では時間がかかりすぎるこの作業を、Pythonスクリプトで自動化する方法を解説します。

完成スクリプト

フォルダ内の画像ファイル(png, webp, bmp等)を一括でjpgに変換するスクリプトがこちらです。

import os
from PIL import Image

def convert_to_jpg(input_folder, output_folder=None, quality=85):
    """
    指定フォルダ内の画像を一括でJPGに変換
    
    Args:
        input_folder (str): 変換元フォルダのパス
        output_folder (str): 変換先フォルダのパス(省略時は元フォルダに_jpgを追加)
        quality (int): JPG画質(1-100、デフォルト85)
    """
    
    # 出力フォルダが指定されていない場合
    if output_folder is None:
        output_folder = input_folder + "_jpg"
    
    # 出力フォルダを作成
    os.makedirs(output_folder, exist_ok=True)
    
    # 対応する画像拡張子
    supported_formats = ('.png', '.webp', '.bmp', '.tiff', '.gif')
    
    converted_count = 0
    
    # フォルダ内のファイルを処理
    for filename in os.listdir(input_folder):
        if filename.lower().endswith(supported_formats):
            input_path = os.path.join(input_folder, filename)
            
            # ファイル名から拡張子を除いてjpgを付ける
            name_without_ext = os.path.splitext(filename)[0]
            output_filename = f"{name_without_ext}.jpg"
            output_path = os.path.join(output_folder, output_filename)
            
            try:
                # 画像を開いて変換
                with Image.open(input_path) as img:
                    # 透明度がある場合は白背景に合成
                    if img.mode in ('RGBA', 'LA', 'P'):
                        # 白背景を作成
                        background = Image.new('RGB', img.size, (255, 255, 255))
                        # 透明度を考慮して合成
                        if img.mode == 'P':
                            img = img.convert('RGBA')
                        background.paste(img, mask=img.split()[-1] if img.mode in ('RGBA', 'LA') else None)
                        img = background
                    else:
                        # RGBモードに変換
                        img = img.convert('RGB')
                    
                    # JPGで保存
                    img.save(output_path, 'JPEG', quality=quality, optimize=True)
                    converted_count += 1
                    print(f"変換完了: {filename} → {output_filename}")
                    
            except Exception as e:
                print(f"エラー: {filename} の変換に失敗しました - {str(e)}")
    
    print(f"\n変換完了: {converted_count}個のファイルを変換しました")
    print(f"出力先: {output_folder}")

# 使用例
if __name__ == "__main__":
    # 変換したいフォルダのパスを指定
    input_folder = "./images"  # ここを変更
    
    # 変換実行
    convert_to_jpg(input_folder, quality=90)

必要なライブラリのインストール

このスクリプトを実行する前に、Pillowライブラリをインストールしてください。

pip install Pillow

使用方法

スクリプトの使い方は以下の通りです。

基本的な使い方

# 基本使用(デフォルト設定)
convert_to_jpg("./images")

# 画質を指定して変換
convert_to_jpg("./images", quality=95)

# 出力先を指定して変換
convert_to_jpg("./images", "./converted_images", quality=80)

コマンドライン版

コマンドラインから直接実行できるバージョンも作成できます。

import sys
import argparse
from PIL import Image
import os

def main():
    parser = argparse.ArgumentParser(description='画像ファイルを一括でJPGに変換')
    parser.add_argument('input_folder', help='変換元フォルダのパス')
    parser.add_argument('-o', '--output', help='出力先フォルダのパス')
    parser.add_argument('-q', '--quality', type=int, default=85, help='JPG画質(1-100)')
    
    args = parser.parse_args()
    
    convert_to_jpg(args.input_folder, args.output, args.quality)

if __name__ == "__main__":
    main()

コマンドライン実行例:

# 基本実行
python convert_images.py ./images

# 画質と出力先を指定
python convert_images.py ./images -o ./jpg_images -q 95

スクリプトの解説

透明度の処理

PNG等の透明度を持つ画像をJPGに変換する際は、白背景との合成処理を行っています。これによりアルファチャンネルが適切に処理されます。

対応形式

このスクリプトは以下の画像形式からJPGへの変換をサポートしています:

  • PNG(透明度対応)
  • WebP
  • BMP
  • TIFF
  • GIF

エラーハンドリング

ファイルの読み込みエラーや変換エラーが発生した場合でも、他のファイルの処理を継続します。エラーメッセージで問題のあるファイルを特定できます。

まとめ

Pillowライブラリを使用することで、複数の画像形式を一括でJPGに変換するスクリプトを簡単に作成できます。透明度の処理やエラーハンドリングも含まれているため、実務での画像処理作業に役立つでしょう。画質パラメータを調整して、用途に応じた最適な変換を行ってください。