🖼️

複数画像に一括で枠線を追加する方法|Python Pillow ライブラリを使用する

に公開

はじめに

先日zennの記事を書いていた時に、背景が白い画像を貼り付けると境界線が見えにくいため、画像に枠線を付けたいと思いました。

https://zenn.dev/zead/articles/ea84ac609f9c00

画像に枠線を付ける方法を調べてみましたが、PowerPointやペイントを使って1つずつ枠線をつけるのでは面倒です。
Photoshopを使用するという方法もありますが、そもそもライセンスを持っていない人が多いのではないでしょうか?(私も持っていません)
複数の画像に一括で枠線を付ける方法はないか探してみたところ、PythonPillowライブラリを使用する方法が簡単そうだったので、今回はその方法について説明したいと思います。

Pillowとは?

Pillowとは、Pythonの画像処理ライブラリの1つです。
Pythonの画像処理ライブラリにはPillow以外にもOpenCV、NumPyなど色々あるようですが、リサイズやトリミングなどの基本的な処理を行いたい場合はPillowライブラリが向いているようです。
Pillowライブラリでは、枠線をつける以外にも以下のような機能があります。

  • 画像モードを変換する(カラー、白黒)
  • 画像のトリミング
  • 画像の回転
  • 画像の貼り付け

https://python-pillow.github.io/

以下のサイトでPillowライブラリの特徴などが詳しく説明されていましたので、参考にさせていただきました!

https://www.sejuku.net/blog/62599

それではPillowライブラリをインストールし、画像に枠線を追加していきましょう。

事前準備

VSCodeを使用する方法で説明します。

1. VSCodeをインストールする

すでにインストール済みであればOKです。

2. Pythonをインストールする

インストール時に「Add Python to PATH」にチェックを入れてください。
こちらも、すでにインストール済みであればOkです。

3. Pillowライブラリをインストールする

VSCodeのターミナルで以下のコマンドを実行します。

pip install pillow

これでPillowライブラリがインストールできました!

VSCodeで枠線追加スクリプトを実行する

1. 新しいフォルダを作成する

好きな場所にスクリプトファイルと画像を保存するためのフォルダを作成します。
ここでは、以下のような構成にします。

add_border_project
├─ input_images               ← 加工したいPNG画像を格納するフォルダ
├─ output_with_border         ← 枠線付き画像を保存するフォルダ
└─ add_border.py              ← スクリプトファイル

2. add_border.pyに以下のコードを貼り付ける

VSCodeでadd_border.pyファイルを開き、以下のコードを貼り付けます。
ここでは、線幅を1ピクセル、枠線の色をグレーに設定しています。

import os
from PIL import Image, ImageOps

# ======= 設定 =======
input_folder = "input_images"           # 入力画像のフォルダ    
output_folder = "output_with_border"    # 出力画像のフォルダ
border_size = 1                         # 枠線のサイズ(ピクセル)
border_color = (200, 200, 200, 255)     # 枠線の色(RGBA形式)
# ====================

# 出力フォルダがなければ作成
os.makedirs(output_folder, exist_ok=True)

# 対象画像の拡張子
valid_extensions = [".jpg", ".jpeg", ".png", ".bmp"]

# フォルダ内の画像に枠線をつけて保存
for filename in os.listdir(input_folder):
    if os.path.splitext(filename)[1].lower() in valid_extensions:
        image_path = os.path.join(input_folder, filename)
        img = Image.open(image_path)

        # 枠線を追加
        bordered_img = ImageOps.expand(img, border=border_size, fill=border_color)

        # 保存
        output_path = os.path.join(output_folder, filename)
        bordered_img.save(output_path)

        print(f"処理完了: {filename}")

print("\nすべての画像に枠線を追加しました!")

フォルダパスや枠線の幅、色は「設定」の箇所を書き換えることで変更可能です。
例えば、枠線を赤で線幅10ピクセルにしたい場合は、border_size、border_colorの値を以下のようにします。

# ======= 設定 =======
input_folder = "input_images"           # 入力画像のフォルダ    
output_folder = "output_with_border"    # 出力画像のフォルダ
border_size = 10                        # 枠線のサイズ(ピクセル)
border_color = (255, 0, 0, 255)         # 枠線の色(RGBA形式)
# ====================

3. input_imagesフォルダに枠線を追加したい画像ファイルを保存する

枠線を追加したい画像をinput_imagesフォルダにコピーします。
指定したフォルダ内のすべての画像ファイルに枠線を追加するため、ファイル名はなんでもOKです。

4. 実行する

add_border.py を開いた状態でVSCodeの画面右上の「▶ Run Python File」をクリックします。
または、ターミナルで「python add_border.py」(環境によってはpy add_border.py)を実行します。

実行結果

「output_folder」で指定したフォルダ(今回は、output_with_borderフォルダ)に、input_imagesフォルダに格納したものと同じファイル名で画像が作成されました。

いかがでしょうか?枠線があると、本文と貼り付けている画像の境界がわかりやすくなり、見えやすくなりますよね。

  • 枠線なし

  • 枠線あり(線幅1px、線色グレー)

まとめ

今回は、複数の画像に一括で枠線をつける方法について説明しました。
普段Pythonを使い慣れていない人も、やってみると意外と簡単なので、ぜひチャレンジしてみてください!

株式会社ジード テックブログ

Discussion