【Python】フォルダ内にある画像のサムネイルを一括作成

Python を使って,フォルダ内の JPEG 形式の画像(拡張子は .jpg)から任意のサムネイル (thumbnail) を一括作成します。

以前,紹介した「Python で社員のサムネイルを作成する」の拡張版です。

Python コード

早速,フォルダ内にある画像のサムネイルを一括作成する Python コードを示します。

from PIL import Image
from pathlib import Path
import glob

# Constants for width and height
SET_WIDTH = 450
SET_HEIGHT = 300

# Paths
PATH_BEFORE = "before/"
PATH_AFTER = "after/"

# Process each image file
files = glob.glob(PATH_BEFORE + "*.jpg")
for file in files:
    img = Image.open(file)

    # Calculate aspect ratios
    aspect_ratio_img = img.width / img.height
    aspect_ratio_set = SET_WIDTH / SET_HEIGHT

    if aspect_ratio_img >= aspect_ratio_set:
        img = img.resize((int(img.width * SET_HEIGHT / img.height), SET_HEIGHT))
        xcrop = (img.width - SET_WIDTH) // 2
        img = img.crop((xcrop, 0, xcrop + SET_WIDTH, SET_HEIGHT))
    else:
        img = img.resize((SET_WIDTH, int(img.height * SET_WIDTH / img.width)))
        ycrop = (img.height - SET_HEIGHT) // 2
        img = img.crop((0, ycrop, SET_WIDTH, ycrop + SET_HEIGHT))

    # Save the processed image
    path = Path(PATH_AFTER + file.replace('before\\', ''))
    img.save(path)

Python コードの解説

ライブラリ読み込み

フォルダ内にある画像のサムネイルを一括作成するのに必要なライブラリを読み込みます。

今回は,PIL(画像処理で利用,Python Image Library),pathlib(オブジェクト指向のファイルシステムパス),glob(Unix 形式のパス名のパターン展開)を用いています。

from PIL import Image
from pathlib import Path
import glob

サムネイルサイズの指定

サムネイルサイズを指定します。SET_WIDTH は 横サイズ,SET_HEIGHT は 縦サイズをピクセルで指定します。

# Constants for width and height
SET_WIDTH = 450
SET_HEIGHT = 300

フォルダの指定

元画像が格納されたフォルダ (PATH_BEFORE),作成したサムネイルを格納するフォルダ (PATH_AFTER) を指定します。

# Paths
PATH_BEFORE = "before/"
PATH_AFTER = "after/"

画像リストを作成

glob を使って,元画像のリスト (files) を作成します。ここでは,元画像が格納されたフォルダの中にある拡張子が jpg のファイルのリストを作成しています。

# Process each image file
files = glob.glob(PATH_BEFORE + "*.jpg")

サムネイル画像の作成

先に作成したファイルのリストで,サムネイル画像を作成します。サムネイル画像の作成については,「Python で社員のサムネイルを作成する」で説明しています。

for file in files:
    img = Image.open(file)

    # Calculate aspect ratios
    aspect_ratio_img = img.width / img.height
    aspect_ratio_set = SET_WIDTH / SET_HEIGHT

    if aspect_ratio_img >= aspect_ratio_set:
        img = img.resize((int(img.width * SET_HEIGHT / img.height), SET_HEIGHT))
        xcrop = (img.width - SET_WIDTH) // 2
        img = img.crop((xcrop, 0, xcrop + SET_WIDTH, SET_HEIGHT))
    else:
        img = img.resize((SET_WIDTH, int(img.height * SET_WIDTH / img.width)))
        ycrop = (img.height - SET_HEIGHT) // 2
        img = img.crop((0, ycrop, SET_WIDTH, ycrop + SET_HEIGHT))

    # Save the processed image
    path = Path(PATH_AFTER + file.replace('before\\', ''))
    print(path)
    img.save(path)

謝辞

今回,紹介した Python コードは,Microsoft Copilot のコードレビューを踏まえ,リファクタリングしています。

更新履歴

  • 2024年10月14日 新規作成

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です