【python】複数の画像ファイルを回転させたい

【python】複数の画像ファイルを回転させたい

写真ので複数の画像ファイルを回転させたい時がありましたのでpythonで作成しました。フォルダ構成を気にせずに使えるようにしています。

実行結果のイメージ

以下のbeforeフォルダに任意の画像を入れてmain.pyを実行すると同じフォルダ構成で画像を90回転させたafterフォルダが作成されます。

<フォルダ構成>

<実行結果のイメージ>

プログラム

import os
from os import path
import sys
from PIL import Image
import shutil


#元画像ファイルが入っているフォルダを指定
before_path=path.join(path.dirname(sys.argv[0]),"before")
#回転後の画像ファイルを入れるフォルダを指定
after_path=path.join(path.dirname(sys.argv[0]),"after")

#回転後の画像ファイルを入れるフォルダを削除(初期化)
shutil.rmtree(after_path)

#beforeフォルダのパス読み取り
#os.walkは指定したパス以下のすべてのフォルダ構成を[調査したフォルダのパス,[入っているフォルダ名],[入っているファイル名]]で返す
before_folders=list(os.walk(before_path))
print("リスト化",list(before_folders))
print("\r")


i=[]
for i in before_folders:
    print("i→",i)
    #元画像が入っているフォルダのパスを取得(os.walkで調べたパスにすることでフォルダ階層ごとに取得可能)
    before_folder_path=i[0]
    print("before_folder_path→",before_folder_path)
    #回転後画像を保存するフォルダのパスを作成(beforeフォルダと同じフォルダ構成で保存)
    after_folder_path=before_folder_path.replace("before","after")
    print("after_folder_path→",after_folder_path)
    os.makedirs(after_folder_path)
    #画像ファイル名取得
    before_images=i[2]
    print("before_images→",before_images)
    for i2 in before_images:
        before_image=i2
        print("回転した画像→",before_image)
        #回転する元画像のパスを指定
        image_path1 = path.join(before_folder_path,before_image)
        #回転後に保存するファイル名をパスで指定
        image_path2 = path.join(after_folder_path,before_image)
        #Imageで元画像を読み込み
        img = Image.open(image_path1)
        #画像を90度回転
        new_img = img.rotate(90,expand=True)
        #画像を保存
        new_img.save(image_path2)
    print("\r")

実行結果

解説

■1~5行目
 使用するモジュールのimportです。PILはpipでインストールしてください。
■8~14行目
 元画像が入っているbeforeフォルダと回転後の画像を入れるafterフォルダのパスを指定して、初期化のためにafterフォルダを消去
■16~19行目
 os.walkでbeforeフォルダ以下のすべてのフォルダとファイルを検索する。(ここではprintで実行結果を表示したいためにbefore_foldersに入れるタイミングでlistにしていますが、消去しても24行目のfor文で代入されますので問題ないです。)
 os.walkでは指定した最初のパスにあるbeforeフォルダの情報が最初のデータとして、次にbeforeフォルダ内にある別フォルダに・・・といったようにデータが出力されます。
 (イメージ)
 beforeフォルダのパス, [含まれているフォルダ名(01,02)][含まれているファイル名(省略)]
 →01フォルダのパス,[含まれているフォルダ名(なし)][含まれているフォルダ名]
 →02フォルダのパス,[含まれているフォルダ名](03)[含まれているフォルダ名]
 →03フォルダのパス,[含まれているフォルダ名](03)[含まれているフォルダ名]
■24~32行目
 for文で取り出したi[0]がbeforeフォルダのパスになります。forの1回目は8行目と同じパスになりますが、beforeフォルダが階層構造になっている場合は、2回目以降は階層に沿ったパスとなります。
 保存先のafterフォルダもbeforeフォルダと同じ構成にしたいので、30行目でbeforeフォルダパスのbeforeをafterに置換し、32行目でフォルダを作成します。
■34行目
 i[2]が含まれている画像ファイルのため取り出し36行目以降でfor文で繰り返し画像を回転させます。 
■36行目以降
 40行と42行:回転させる画像のファイルのパスと保存するファイルのパスを指定します。
 44行:Imageで画像を読み込み
 46行:画像を90度回転(90を変えれば任意の角度で回転できます)
 48行:画像を保存