PythonとPillowで複数の画像にロゴを一括で追加する

この記事では、Pythonの画像処理ライブラリPillowを使い、特定のフォルダ内にあるすべての画像ファイルに、ロゴやウォーターマークを一括で追加する実用的なスクリプトの作成方法を解説します。


目次

1. 準備:Pillowのインストールとファイル配置

このスクリプトは、サードパーティ製ライブラリPillowを使用します。事前にインストールしてください。

pip install Pillow

次に、スクリプトを配置するフォルダに、ロゴとして使用する画像ファイル(例: logo.png)と、ロゴを追加したい画像ファイル(複数可、.png.jpg形式)を配置してください。


2. プロジェクトの設計

スクリプトは以下の流れで動作します。

  1. ロゴファイル名や、処理後画像の最大サイズなどの定数を設定する。
  2. ロゴを追加した画像を保存するための出力用フォルダ(例: with_logo)を作成する。
  3. ロゴ画像をImageオブジェクトとして開く。
  4. カレントディレクトリ内のすべてのファイルをループでチェックする。
  5. ファイルが画像(.pngまたは.jpg)であり、かつロゴファイル自体でなければ、処理を開始する。
  6. 画像を指定した最大サイズに収まるようにリサイズ(サムネイル化)する。
  7. リサイズした画像の右下にロゴ画像を貼り付ける(ペーストする)。
  8. ロゴが追加された画像を、出力用フォルダに保存する。

3. 完成したコード全体

上記の設計に基づいた完全なスクリプトを以下に示します。

from pathlib import Path
from PIL import Image

# --- 設定 ---
MAX_IMAGE_SIZE = 400  # 処理後画像の最大幅・高さ
LOGO_FILENAME = 'logo.png' # ロゴのファイル名
OUTPUT_FOLDER = 'with_logo' # 出力先フォルダ名

# 1. ロゴ画像を開く
try:
    logo_image = Image.open(LOGO_FILENAME)
    logo_width, logo_height = logo_image.size
except FileNotFoundError:
    print(f"エラー: ロゴファイル '{LOGO_FILENAME}' が見つかりません。")
    exit()

# 2. 出力用フォルダを作成
output_dir = Path(OUTPUT_FOLDER)
output_dir.mkdir(exist_ok=True)

# 3. カレントディレクトリの画像をループ処理
for file_path in Path('.').iterdir():
    # 画像ファイル(.png, .jpg)であり、ロゴファイル自体ではない場合に処理
    extension = str(file_path.suffix).lower()
    if not (extension in ['.png', '.jpg']) or file_path.name == LOGO_FILENAME:
        continue

    # 4. 画像を開き、リサイズ
    main_image = Image.open(file_path)
    width, height = main_image.size
    
    # 画像が大きすぎる場合のみリサイズ
    if width > MAX_IMAGE_SIZE or height > MAX_IMAGE_SIZE:
        main_image.thumbnail((MAX_IMAGE_SIZE, MAX_IMAGE_SIZE))
        width, height = main_image.size
        print(f"リサイズ中: {file_path.name}...")

    # 5. ロゴを右下に貼り付け
    print(f"ロゴを追加中: {file_path.name}...")
    paste_position = (width - logo_width, height - logo_height)
    main_image.paste(logo_image, paste_position, logo_image)

    # 6. 結果を保存
    main_image.save(output_dir / file_path.name)

print("すべての処理が完了しました。")

4. コードの解説

Path('.').iterdir() pathlibモジュールを使い、カレントディレクトリ内のすべてのファイルとフォルダをループ処理しています。

main_image.thumbnail(...) アスペクト比を維持したまま、指定したサイズ(この場合は400×400)のボックスに収まるように画像を縮小します。元のImageオブジェクトを直接変更します。

main_image.paste(logo_image, paste_position, logo_image) pasteメソッドの第3引数にロゴ画像自体を渡しています。これは、ロゴ画像が持つ透明度(アルファチャンネル)をマスクとして利用するためのテクニックです。これにより、ロゴの透明な部分が正しく下の画像に合成されます。

まとめ

このスクリプトは、Pillowライブラリが、ファイルの検索(pathlibと連携)、リサイズ(.thumbnail())、画像の合成(.paste())といった一連の画像処理タスクを自動化するのにいかに強力であるかを示しています。手作業では時間のかかる多数の画像へのロゴ追加作業も、このようなスクリプトを使えば瞬時に完了させることができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次