Pythonでフォルダ内の全画像を一括トリミングしてみた

# はじめに
こんばんは、今日はクリスマスですね。
卒業を控えた理系の学生方は今日も論文に追われていることでしょう。

今回、私は論文を書いていて「実験結果のスクリーンショットたくさん撮ったけど1枚ずつトリミングするのめんどくさい！」と思ったのでPythonで自動一括トリミングのコードを作ってみました。

同じような悩みがある人はぜひご活用ください。

# この記事の目次
- [対象読者](#対象読者)
- [実現したいこと](#実現したいこと)
- [必要な環境](#必要な環境)
- [Step1: トリミング領域を見つける](#step1トリミング領域を見つける)
- [Step2: Pythonコードを作成](#step2pythonコードを作成)
- [Step3: Pythonコードを実行](#step3pythonコードを実行)
- [おわりに](#おわりに)

# 対象読者
- フォルダ内の画像を一括でトリミングしたい方

# 実現したいこと
- 指定したフォルダ(input_folder)内のすべての画像を指定したトリミング領域(```top```, ```bottom```, ```left```, ```right```)で一括トリミングして、別フォルダ(```output_folder```)内に保存

# 必要な環境
- Python 3.11.9

# Step1:トリミング領域を見つける
まず、自分がトリミングしたい画像のトリミング領域を見つける必要があります。
画像ファイルは(1916 × 1076px)のようにピクセルによって構成されています。この場合、画像の左上が(0, 0)、右下が(1916, 1076)という座標を持っています。
今回は座標を指定することでトリミング領域を決定していきます。

ペイントツールでトリミングしたい画像ファイルを開きましょう。

![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953986/23fd32da-3b80-7a02-8d62-6dbc8a271d99.png)
![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953986/5c659ea1-d2b5-c3dc-0e2a-382144e46843.png)

カーソル位置の座標を画面左下から確認することができます。
図を見てもらうとわかる通り赤い丸部分のカーソル位置の座標が左下に表示されています。
これらの情報からトリミングしたい領域(上下左右)をメモしておきましょう。

# Step2:Pythonコードを作成
以下のPythonコードで指定フォルダ内の画像ファイルを一括トリミングできます。
自分で指定する値は、
- ```top```, ```bottom```, ```right```, ```left```：トリミング領域
- ```input_folder```：トリミング前の画像ファイルが入っているフォルダ名
- ```output_foldrer```：トリミング後の画像ファイルを入れるフォルダ名

です。

```trim.py
from PIL import Image
import os

# ペイントツールで座標を見てトリミングする範囲を設定(上下左右)
top    = 330
bottom = 820
right  = 1390
left   = 890

# トリミング範囲を指定 (左上の座標(x1, y1)と右下の座標(x2, y2))
crop_area = (left, top, right, bottom)

# 指定されたフォルダ内のすべてのjpgファイルを処理
input_folder = "raw_image" # 入力用のフォルダ名

# トリミング後の画像を保存するフォルダ
output_folder = input_folder + "_trimmed" # 出力用のフォルダ名
os.makedirs(output_folder, exist_ok=True)

# 入力フォルダが存在しない場合はエラーメッセージを出力して終了
if not os.path.exists(input_folder):
    print(f"エラー: 入力フォルダ '{input_folder}' が存在しません。")
    exit(1)

for filename in os.listdir(input_folder):
    if filename.endswith(".jpg"):
        try:
            input_path = os.path.join(input_folder, filename)
            img = Image.open(input_path)
            cropped_img = img.crop(crop_area)
            output_path = os.path.join(output_folder, filename)
            cropped_img.save(output_path)
            print(f"Processed: {filename}")
        except Exception as e:
            print(f"Failed to process {filename}: {e}")

print("すべてのファイルが処理されました。")
```

# Step3:Pythonコードを実行
それではStep2で作成したPythonコードを実行していきましょう。
```trim.py```とrow_imageフォルダは以下のディレクトリ構造のように配置してください。

```plaintext
captured/
├── trim.py 
└── raw_image/
    ├── image1.jpg
    ├── image2.jpg
    └── ...
```
いよいよ実行です。
```shell-session
> python trim.py
Processed: image1.jpg
Processed: image2.jpg
Processed:    ・
Processed:    ・
Processed:    ・
すべてのファイルが処理されました。
```
実行後、コードの```output_folder```で指定したraw_image_trimmedフォルダが新たに作成され、その中にトリミング後の画像ファイルが保存されています。
```plaintext
captured/
├── trim.py  
└── raw_image/
    ├── image1.jpg
    ├── image2.jpg
    └── ...
└── raw_image_trimmed/
    ├── image1.jpg
    ├── image2.jpg
    └── ...
```

# おわりに
ここまで読んでいただきありがとうございます！
ぜひ本記事を使ってご自身の論文作成を効率化させてください。
これからも研究を楽しみましょう！

それでは皆さん、よいお年を！