とっちゃん@nyanco! です。
今回はWindowsで複数の画像ファイルをドラッグ&ドロップするだけで指定した横幅を基準に一括リサイズ(比率は変えずに縮小)してソースと同じディレクトリにフォルダを自動生成してその中に出力してくれるPythonコードの共有です。
画像ファイルでもフォルダでも複数D&D対応してますにゃ~
とにかくラクチンですにゃ~
コードの動作環境
- OS:Windows10 ※macOSでは未確認
- Pythonバージョン:3.11.2
- 必要ライブラリ:画像処理ライブラリPIL(Pillow) →要インストール【pip install Pillow】
コード作成のきっかけ
画像を一括で小さくリサイズする業務がルーティンであり、これまではリサイズ処理にフリーソフトを使っていたのですが、複数フォルダを一括でできるようになると便利だよな~とふと思ってChatGPTにお願いしたら実現できたので共有します。
コードの挙動
コードの挙動は以下の通りです。
画像をドラッグ&ドロップした場合
- 画像をPythonファイルにドラッグ&ドロップ(画像は複数でもOK!)
- ソース画像のあるディレクトリに「resized」というフォルダを新規作成してその中にリサイズした画像が保存される
フォルダをドラッグ&ドロップした場合
- フォルダをPythonファイルにドラッグ&ドロップ(フォルダは複数でもOK!)
- フォルダの中の画像を一括リサイズ処理(サブフォルダ内の画像も処理)
- ソース画像のあるそれぞれのディレクトリに「resized」というフォルダを新規作成してその中にリサイズした画像が保存される
ちなみに指定したサイズより元々小さい画像は処理しない(縮小のみ)仕様にしておりますにゃ~
複数画像を一括リサイズするPythonコード
早速ですがコードはこちら!
import os
import sys
from PIL import Image
# リサイズ後の画像を格納するサブフォルダの名前
output_subfolder = "resized"
target_width = 400 # 横幅を400pxにリサイズ
def resize_image(file_path, output_folder):
# 画像を開く
with Image.open(file_path) as img:
# 横幅が指定幅より大きい場合のみ縮小
if img.width > target_width:
# 指定した幅にリサイズ
width_percent = (target_width / float(img.width))
new_height = int((float(img.height) * float(width_percent)))
resized_img = img.resize((target_width, new_height), Image.ANTIALIAS)
# リサイズされた画像を保存
filename = os.path.basename(file_path)
output_path = os.path.join(output_folder, filename)
resized_img.save(output_path)
else:
# 指定した幅以下の場合、オリジナルの画像をコピー
output_path = os.path.join(output_folder, os.path.basename(file_path))
img.save(output_path)
def process_path(path):
# フォルダか画像ファイルかをチェック
if os.path.isdir(path):
# フォルダの場合、フォルダ内のファイルを処理
for root, _, files in os.walk(path):
for file in files:
file_path = os.path.join(root, file)
process_path(file_path)
elif os.path.isfile(path):
# 画像ファイルの場合、画像をリサイズ
valid_extensions = ('.jpg', '.jpeg', '.png', '.gif') # 対応する画像フォーマットを追加
if path.lower().endswith(valid_extensions):
output_folder = os.path.join(os.path.dirname(path), output_subfolder)
if not os.path.exists(output_folder):
os.makedirs(output_folder)
resize_image(path, output_folder)
if __name__ == "__main__":
# ドラッグ&ドロップされたパスを処理
for path in sys.argv[1:]:
process_path(path)
print("画像のリサイズが完了しました。")
コードはChatGPTで作成したものを少しカスタマイズしています。
6行目の「target_width = 400」の「400」がリサイズ基準となる横幅(単位:ピクセル)となるので、こちらを任意の数値に変更してお使いください。
リサイズ基準がいくつかある場合は、その都度ファイルを編集するよりリサイズ基準ごとにPythonファイル(.pyファイル)を用意しておくとドラッグ&ドロップ先を替えるだけで任意のサイズに変更できるのでとても便利です。
その際、ファイル名でリサイズ基準が分かるようにしておくと尚良しです。
▼サクッとすぐに使えるように下記より.pyファイルのダウンロードも可能です(zip圧縮しています)。
→画像データを横幅基準で一括リサイズするPythonコードをダウンロード
おわりに
本記事がどなたかの参考になれば幸いです。
今回は以上となります。
最後まで読んでいただきましてありがとうございました!
それではまた〜✧٩(ˊωˋ*)و✧
コメント