MENU

Pythonで画像をサムネ用に16:9アスペクト比にする空白のパディング追加

この記事では、Pythonを使用して画像にパディングを追加し、指定したアスペクト比(16:9など)に調整するスクリプトの解説を行います。特に、WebP形式で保存するための実用的なコード例を示し、その用途や仕組みを説明します。


目次

スクリプトの概要

このスクリプトは、以下の目的で使用できます。

  1. 画像のアスペクト比を統一する:
    • 画像の幅と高さの比率が異なる場合でも、白いパディングを追加して指定したアスペクト比(例: 16:9)に整えることができます。
  2. WebP形式で保存:
    • 処理済みの画像をWebP形式で保存することで、ファイルサイズを小さくしつつ、画質を維持します。
  3. 自動化と簡略化:
    • コマンドライン引数を使用して入力画像と出力画像のパスを指定し、簡単に処理を実行可能です。

ライブラリのインストール

このスクリプトを実行するためには、以下のライブラリをインストールする必要があります。

  1. Pillow(Python Imaging Library)

インストールコマンド:

pip install pillow
  • Pillowは、Pythonで画像処理を行うためのライブラリで、様々な画像フォーマットの操作をサポートしています。

スクリプトのコードと解説

以下はスクリプトの全体コードです。部分ごとに詳細を解説します。

from PIL import Image, ImageOps
import sys
import os

def add_padding_to_aspect_ratio(image_path, output_path, target_aspect_ratio=(16, 9)):
    try:
        # 画像を開く
        img = Image.open(image_path)
        original_width, original_height = img.size

        # 元画像のアスペクト比を計算
        original_aspect_ratio = original_width / original_height

        # 目標のアスペクト比を計算
        target_width, target_height = target_aspect_ratio
        target_aspect_ratio_value = target_width / target_height

        # 新しいサイズを計算
        if original_aspect_ratio > target_aspect_ratio_value:
            # 横長の場合は高さを合わせる
            new_width = original_width
            new_height = int(original_width / target_aspect_ratio_value)
        else:
            # 縦長の場合は幅を合わせる
            new_height = original_height
            new_width = int(original_height * target_aspect_ratio_value)

        # 新しいキャンバスのサイズに合わせてパディングを追加
        new_size = (new_width, new_height)
        padded_image = ImageOps.pad(img, new_size, color="white")

        # WebP形式で保存
        padded_image.save(output_path, format="WEBP")
        print(f"画像を処理しました: {output_path}")

    except Exception as e:
        print(f"エラーが発生しました: {e}")

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("使用法: python add_padding.py 入力画像パス 出力画像パス")
        sys.exit(1)

    input_image = sys.argv[1]
    output_image = sys.argv[2]

    if not os.path.isfile(input_image):
        print(f"入力ファイルが存在しません: {input_image}")
        sys.exit(1)

    add_padding_to_aspect_ratio(input_image, output_image)

コードの詳細解説

1. ライブラリのインポート

from PIL import Image, ImageOps
import sys
import os

  • Pillow: 画像処理を行うためのPythonライブラリ。
  • sys: コマンドライン引数を扱うために使用。
  • os: ファイルの存在確認に使用。

2. 関数の定義

def add_padding_to_aspect_ratio(image_path, output_path, target_aspect_ratio=(16, 9)):

  • image_path: 入力画像のパス。
  • output_path: 出力画像の保存先。
  • target_aspect_ratio: タプル形式で目標アスペクト比を指定(デフォルト: 16:9)。

3. 画像の読み込みと元サイズの取得

img = Image.open(image_path)
original_width, original_height = img.size

  • 画像を開いて元の幅と高さを取得します。

4. 新しいサイズの計算

if original_aspect_ratio > target_aspect_ratio_value:
    new_width = original_width
    new_height = int(original_width / target_aspect_ratio_value)
else:
    new_height = original_height
    new_width = int(original_height * target_aspect_ratio_value)

  • 元画像のアスペクト比を計算し、目標アスペクト比に合わせて新しいキャンバスサイズを決定します。

5. パディングの追加

new_size = (new_width, new_height)
padded_image = ImageOps.pad(img, new_size, color="white")

  • ImageOps.padを使用して、新しいサイズに合わせたパディングを追加します。
  • パディングの色は白(color="white")に設定されています。

6. WebP形式で保存

padded_image.save(output_path, format="WEBP")

  • 処理済み画像をWebP形式で保存します。

7. コマンドライン引数の処理

if len(sys.argv) != 3:
    print("使用法: python add_padding.py 入力画像パス 出力画像パス")
    sys.exit(1)

  • コマンドライン引数が正しく指定されていない場合、エラーメッセージを表示して終了します。

8. 入力ファイルの存在確認

if not os.path.isfile(input_image):
    print(f"入力ファイルが存在しません: {input_image}")
    sys.exit(1)

  • 入力画像が存在しない場合、エラーメッセージを表示して終了します。

使用例

コマンドラインでの実行

python add_padding.py sample.jpg output.webp

  • sample.jpg: 入力画像。
  • output.webp: 出力画像の保存先。

実行結果

  • 入力画像のアスペクト比が目標(16:9)に調整され、白いパディングが追加された画像がoutput.webpとして保存されます。

応用例と拡張

  1. 異なるアスペクト比のサポート:
    • (4, 3)(1, 1)など、目標アスペクト比を柔軟に変更可能。
  2. カスタムパディング色:
    • color="white"を変更することで、黒や透明など他の色に対応可能。
  3. バッチ処理:
    • 複数の画像を一括で処理する機能を追加できます。

結論

このスクリプトは、画像のアスペクト比を簡単に調整し、統一感のあるレイアウトを作成するための便利なツールです。特に、WebP形式で保存することで、効率的なストレージ利用と高速なウェブ表示を実現できます。

目次