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に変換するスクリプトを簡単に作成できます。透明度の処理やエラーハンドリングも含まれているため、実務での画像処理作業に役立つでしょう。画質パラメータを調整して、用途に応じた最適な変換を行ってください。
