Pythonで写真をまとめてリサイズ・変換する方法
フォルダ内の写真を、まとめて指定サイズ・形式に変換します
この記事は、「Pythonでできる日常の自動化6選」で紹介した⑥写真をまとめてリサイズ・変換の詳しい作り方をまとめた記事です。
ブログやSNSに写真を投稿するとき、1枚ずつサイズを変更したり、形式を変換したりするのは手間がかかります。Pythonの「Pillow」という画像処理ライブラリを使えば、フォルダ内の写真をまとめて指定のサイズにリサイズしたり、形式を変換したりする作業を自動化できます。
- 1
- 2
- 3
- 4
- 5
用意するもの
- Python本体
- コードを書くためのエディタ(VS Codeなど)
- Pillow(画像を扱うライブラリ)
Pythonのインストール、コードを書くためのエディタ(VS Code)の準備、コードの書き方・実行方法がまだの方は、先に「Pythonを始める前に:インストールとエディタの準備」を済ませてから、この続きに進んでください。
ターミナルで以下のコマンドを実行し、Pillowをインストールします。
pip install pillow
画像処理の基本を知る
Pillowでの画像処理は、基本的に「①画像を開く → ②加工する(リサイズ・変換など) → ③保存する」という3つのステップの繰り返しです。この流れさえ覚えてしまえば、応用がききやすくなります。
1枚の写真をリサイズしてみる
まずは1枚の写真で、縦横の比率を保ったまま指定サイズ以内に収まるようリサイズしてみましょう。
from PIL import Image
img = Image.open("photo.jpg")
img.thumbnail((800, 800)) # 横幅・縦幅がそれぞれ800pxを超えないように、比率を保ったまま縮小
img.save("photo_resized.jpg")
print("リサイズが完了しました")
実行すると、縦横の比率はそのままに、大きい方の辺が800pxに収まるようリサイズされたphoto_resized.jpgが作成されます。
Pillowにはresize((幅, 高さ))という、縦横を指定した数値ぴったりに変形させる方法もありますが、縦横比が元の写真と違うと画像が歪んでしまいます。写真をきれいなまま縮小したい場合は、この記事で使うthumbnail()がおすすめです。
フォルダ内の写真をまとめてリサイズする
先ほどの処理を、フォルダ内のすべての写真に対して繰り返せば、まとめてリサイズできます。
from pathlib import Path
from PIL import Image
source_dir = Path.home() / "Desktop" / "test_photos"
output_dir = source_dir / "resized"
output_dir.mkdir(exist_ok=True)
for photo in source_dir.glob("*.jpg"):
img = Image.open(photo)
img.thumbnail((800, 800))
img.save(output_dir / photo.name)
print("すべての写真のリサイズが完了しました")
実行すると、「resized」という新しいフォルダが作られ、リサイズ後の写真がそこに保存されます。元の写真はそのまま残るので、安心して試すことができます。
source_dir.glob("*.jpg")は拡張子が.jpgのファイルだけを対象にします。.jpegや.pngも含めたい場合は、for pattern in ("*.jpg", "*.jpeg", "*.png"):のように対象パターンを増やして、その中でもう一度globのループを回してください。
画像の形式を変換する
Pillowでは、開いたときと違う拡張子で保存するだけで、自動的に形式が変換されます。
from PIL import Image
img = Image.open("photo.png")
img = img.convert("RGB") # JPEGは透過に対応していないため変換前に必要
img.save("photo.jpg")
print("形式の変換が完了しました")
img.convert("RGB")は、色の表現形式をJPEGで保存できる形に変換するための一行です。PNGなど、背景が透明になる「透過」情報を持つ画像をJPEGに変換する場合は、この行がないとエラーになることがあるため、変換前に必ず入れておくと安心です。
iPhoneのHEIC写真を扱うには
iPhoneで撮影した写真は、標準で「HEIC」という形式になっていることが多く、Pillow単体ではこの形式を開けません。pillow-heifという追加ライブラリを入れることで、これまでと同じ書き方でHEICファイルも扱えるようになります。
pip install pillow-heif
from pillow_heif import register_heif_opener
from PIL import Image
register_heif_opener() # この1行を追加するだけでHEICも開けるようになる
img = Image.open("photo.heic")
img.thumbnail((800, 800))
img = img.convert("RGB")
img.save("photo.jpg")
print("HEIC写真の変換が完了しました")
register_heif_opener()を最初に一度呼び出しておけば、あとはImage.open()にそのままHEICファイルを渡すだけで、これまで通りの操作ができるようになります。
うまくいかないときのトラブルシューティング
from PIL import ImageOpsのうえでimg = ImageOps.exif_transpose(img)を、Image.openの直後に追加すると解決します。save("photo.jpg", quality=90)のようにqualityを指定すると、画質を調整できます(数値は1〜95程度、数値が大きいほど高画質・ファイルサイズも大きくなります)。指定しない場合は標準的な画質で保存されます。まとめ
Pillowを使って、写真のリサイズ・まとめての一括処理・形式変換、そしてiPhoneのHEIC写真への対応まで紹介しました。ブログやSNSへの投稿前のひと手間を自動化して、写真整理を楽にしてみてください。


コメント