非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Python】画像切り抜きを自動化!特定キーワードのファイルを一括クロップする方法

   

仕事で膨大な画像データを扱う際、一枚ずつ手作業で中身を確認し決まった範囲を切り取って報告書に貼り付ける……そんな単純作業に僕はよく追われています。特に、膨大な画像データから特定の名称が含まれるファイルだけを探し出し定型サイズで切り取って保存する作業は数が増えるほどミスも起きやすく精神的な負担も大きくなります。

そんな中でPythonで自動化したので共有します。あらかじめテキスト形式で保存しておいたキーワードから合致する画像を自動抽出し指定したサイズで切り抜いて保存する効率化ツールです。

以下のコードは、Keyword.txt に記載されたキーワードをもとに画像を検索し、設定した座標で切り抜いて保存するプログラムです。

import os
from PIL import Image

# ================= ユーザー設定エリア =================
# 1. 画像が保存されている元のフォルダパスを指定
SOURCE_DIR = 'data/raw_images' 

# 2. 切り抜き範囲の設定 (単位: ピクセル)
# 左上の開始地点 (LEFT, TOP) と、そこからの 幅 (WIDTH)・高さ (HEIGHT)
LEFT, TOP = 100, 150
WIDTH, HEIGHT = 500, 300

# 3. 切り抜いた画像の保存先フォルダ名
SAVE_DIR = 'crop'
# ===================================================

def auto_crop_process():
    """
    キーワードに基づいて画像を検索し、一括で切り抜き保存を行うメイン関数
    """
    
    # --- 保存先フォルダの準備 ---
    # フォルダが存在しない場合は自動で作成し、エラーを防ぐ
    if not os.path.exists(SAVE_DIR):
        os.makedirs(SAVE_DIR)
        print(f"Directory created: {SAVE_DIR}")

    # --- キーワードリストの読み込み ---
    # Keyword.txt から改行区切りでキーワードを取得し、リスト化する
    try:
        with open('Keyword.txt', 'r', encoding='utf-8') as f:
            # 各行の空白を除去し、空行は無視する
            keywords = [line.strip() for line in f if line.strip()]
    except FileNotFoundError:
        print("Error: 'Keyword.txt' が見つかりません。ファイルを作成してください。")
        return

    # --- 画像処理の実行 ---
    # 指定フォルダ内の全ファイル名を取得
    all_files = os.listdir(SOURCE_DIR)
    # .png 画像のみを対象にする
    image_files = [f for f in all_files if f.lower().endswith('.png')]

    for keyword in keywords:
        # ファイル名にキーワードが含まれているかチェック
        # 最初に見つかった1件をターゲットとする
        target_file = next((f for f in image_files if keyword in f), None)

        if target_file:
            input_path = os.path.join(SOURCE_DIR, target_file)
            output_path = os.path.join(SAVE_DIR, f"{keyword}.png")

            try:
                # 画像を開く
                with Image.open(input_path) as img:
                    # Pillowの座標系は (左, 上, 右, 下) のため、幅と高さを加算して算出
                    right = LEFT + WIDTH
                    bottom = TOP + HEIGHT
                    
                    # 指定範囲で切り抜き (Crop)
                    cropped_img = img.crop((LEFT, TOP, right, bottom))
                    
                    # 指定したキーワードをファイル名にして保存
                    cropped_img.save(output_path)
                    
                    print(f"【成功】{target_file} -> {output_path}")
            except Exception as e:
                print(f"【エラー】{target_file} の処理中に問題が発生しました: {e}")
        else:
            print(f"【未発見】キーワード '{keyword}' を含む画像が {SOURCE_DIR} 内にありません。")

if __name__ == "__main__":
    auto_crop_process()
 

 

ポイント
  • 柔軟な座標指定: 変数 LEFT, TOP, WIDTH, HEIGHT を書き換えるだけで、どんな定型サイズにも対応可能。
  • フォルダ自動生成: os.path.exists と os.makedirs を組み合わせることで、実行環境を選ばずスムーズに動作できる。
  • エラーハンドリング: Keyword.txt がない場合や、画像処理中にエラーが起きた場合でも、プログラムが急停止しないよう配慮。
  • ファイル検索: next() 関数とジェネレータ式を使い、膨大なファイルの中からキーワードに一致するものを効率よく探し出す。

 

スポンサーリンク

 - Python