Pythonで写真をまとめてリサイズ・変換する方法【iPhoneのHEICにも対応】

python
自動化・詳細手順

Pythonで写真をまとめてリサイズ・変換する方法

フォルダ内の写真を、まとめて指定サイズ・形式に変換します

プログラミング未経験OK 所要時間の目安:20分程度

この記事は、「Pythonでできる日常の自動化6選」で紹介した⑥写真をまとめてリサイズ・変換の詳しい作り方をまとめた記事です。

ブログやSNSに写真を投稿するとき、1枚ずつサイズを変更したり、形式を変換したりするのは手間がかかります。Pythonの「Pillow」という画像処理ライブラリを使えば、フォルダ内の写真をまとめて指定のサイズにリサイズしたり、形式を変換したりする作業を自動化できます。

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

用意するもの

  • Python本体
  • コードを書くためのエディタ(VS Codeなど)
  • Pillow(画像を扱うライブラリ)
INFO

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が作成されます。

MEMO

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」という新しいフォルダが作られ、リサイズ後の写真がそこに保存されます。元の写真はそのまま残るので、安心して試すことができます。

MEMO

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ファイルを渡すだけで、これまで通りの操作ができるようになります。

うまくいかないときのトラブルシューティング

写真が90度回転して保存されてしまいます
スマホで撮影した写真には、正しい向きの情報がExif(撮影情報)として別途記録されていることがあり、Pillowがそれを自動で反映しないために起こります。from PIL import ImageOpsのうえでimg = ImageOps.exif_transpose(img)を、Image.openの直後に追加すると解決します。
透過(背景が透明)のPNGをJPEGに変換すると背景が黒くなります
JPEGは透過を扱えないため、変換時に透明部分が黒などで塗りつぶされることがあります。透過を保ったまま使いたい場合は、JPEGに変換せずPNGのまま保存することをおすすめします。
JPEGの画質が悪くなった気がします
save("photo.jpg", quality=90)のようにqualityを指定すると、画質を調整できます(数値は1〜95程度、数値が大きいほど高画質・ファイルサイズも大きくなります)。指定しない場合は標準的な画質で保存されます。

まとめ

Pillowを使って、写真のリサイズ・まとめての一括処理・形式変換、そしてiPhoneのHEIC写真への対応まで紹介しました。ブログやSNSへの投稿前のひと手間を自動化して、写真整理を楽にしてみてください。

他の自動化アイデアも見てみる

家計簿の自動集計やファイル整理など、Pythonでできる生活の自動化アイデアを6つ紹介しています。

6テーマ一覧を見る

コメント

タイトルとURLをコピーしました