Python

フォルダの中のファイルをリサイズ・リネームして他のフォルダに一括出力する方法

今回はフォルダの中にあるファイルをリサイズしてリネームして他のフォルダに一括で出力する方法のメモになります。

動作環境

venvです。

プロジェクト構成

プロジェクト ----- input_images(フォルダ)
                     |
                     __ main.py

ファイル操作をするライブラリのインストール

下記のコマンドを叩きます。

pip install pillow

ライブラリを使う為の記述

main.pyに下記の記述をします。

import os
from PIL import Image

ファイルを出力するフォルダの設定

リサイズ・リネームしたあとのファイルを出力するフォルダの設定をする為にmain.pyに下記の記述をします。

import os
from PIL import Image


//ここから追加
input_folder = "input_images"
output_folder = "output_images"
os.makedirs(output_folder, exist_ok = True)
//ここまで追加

input_folderはリサイズ・リネームをする元になるファイルが格納されているフォルダでoutput_folderは出力されるファイルが格納されるフォルダです。

8行目の記述でoutput_folderがない場合は新規作成されます。

だから初期状態でoutput_folderを用意しませんでした。

ファイルの拡張子を小文字に変える

「.PNG」などの拡張子が大文字になっている場合は「.png」を変換の対象にした時は対象にならないので拡張子を小文字に変えます。

main.pyに下記の記述をします。

import os
from PIL import Image

input_folder = "input_images"
output_folder = "output_images"
os.makedirs(output_folder, exist_ok = True)


//ここから追加
image_files = []
for f in os.listdir(input_folder):
    if f.lower().endswith(('png', 'jpg', 'jpeg')):
        image_files.append(f)
//ここまで追加

拡張子を小文字に変換しているのは「f.lower()」の記述です。

ファイルを出力

ファイルをリサイズ・リネームして出力します。

main.pyに下記の記述をします。

import os
from PIL import Image

input_folder = "input_images"
output_folder = "output_images"
os.makedirs(output_folder, exist_ok = True)

image_files = []
for f in os.listdir(input_folder):
    if f.lower().endswith(('png', 'jpg', 'jpeg')):
        image_files.append(f)


//ここから追加
for i, filename in enumerate(image_files, start=1):
    img_path = os.path.join(input_folder, filename)
    img = Image.open(img_path)

    if img.mode == "RGBA":
        img = img.convert("RGB")

    new_width = 500
    ratio = new_width / img.width
    new_height = int(img.height * ratio)
    img_resized = img.resize((new_width, new_height))
    new_filename = f"image_{i:03}.jpg"
    output_path = os.path.join(output_folder, new_filename)
    img_resized.save(output_path, "JPEG", quality=80)
//ここまで追加

画像の拡張子が「jpg」の場合はRGBA(赤・緑・青・不透明度)の不透明度がないです。

26行目でinput_imagesフォルダの中の全ての画像の拡張子をjpgに変換しますが元々の画像の拡張子がpngの場合はRGBAのAがあるのでエラーになります。

だから画像の拡張子がpngの場合にAを取る為に19行目・20行目の記述があります。

23行目の「i:03」の意味ですが「03」は最低三桁の数値になって三桁ない場合は0で補うという意味です。

もしiの値が1なら「001」になりiの値が10なら「010」なります。

28行目で画像の品質を少し落として画像の容量を下げています。

これで完成です。