解説
写真が横向きになる?Exifの向きを反映してから画像を縮小しよう
写真が変換後に横向きになる原因をExif Orientationから確認。Pillowで向きを反映してから縮小し、原本を残す検証済みの手順を紹介する。

写真アプリでは縦向きなのに、変換した画像が横向きになることがある。保存されたピクセルの幅・高さだけでなく、Exifの向き情報を確認してみよう。
Exifは、撮影情報などを画像に持たせる仕組み。Orientationという情報で表示時の向きを指定することがあるんだ。ここではPythonの画像処理ライブラリPillowを使い、原本を残して向きを反映する手順を確認するよ。
保存された幅・高さと、表示される向きは別
編集部の検証では、100×60ピクセルのJPEGにOrientation=6を付けた。Pillowで読み込んだ幅・高さは100×60のまま。向きを反映すると60×100になり、Orientationは取り除かれた。
![]()
図は実際の写真ではなく、向きの違いを見るために生成した矢印の作例。上は保存ピクセルをそのまま取り出した状態、下は向きを反映した結果だよ。画像を見るソフトによっては、元JPEGを開くだけで向きを反映するため、左右の違いを直接見られないこともある。
向きを反映して、別の名前で保存する
Python 3とPillowを使える環境で、処理する画像のコピーを用意する。以下では、そのコピーを phone.jpg とし、同じフォルダで実行するよ。出力先は入力と別名で、既存の同名ファイルがない場所を使ってね。
from PIL import Image, ImageOps
with Image.open("phone.jpg") as source:
print("before", source.size, source.getexif().get(274))
upright = ImageOps.exif_transpose(source)
print("after", upright.size, upright.getexif().get(274))
upright.save("upright.png")
上の合成作例では、Pillow 11.3.0で次の出力を確認した。
before (100, 60) 6
after (60, 100) None
274はOrientationを参照するタグ番号。None は、そのタグが見つからなかったことを表す。出力PNGを開き直しても、60×100でOrientationが残っていないことを確認したよ。
これはファイルを作るPythonの処理で、ページ内のブラウザで実行する作例ではない。実際の写真ではサイズやタグの値は異なり、必ず幅と高さが入れ替わるわけでもない。
縮小するなら、その後に行う
公式資料では、exif_transpose はOrientationに応じて向きを変え、向き情報を除去すると説明している。既定では元のImageをその場で変更せず、新しいImageを返すので、戻り値を使おう。
例えば次のように、向きを反映した画像へ縮小処理を行う。
from PIL import Image, ImageOps
with Image.open("phone.jpg") as source:
upright = ImageOps.exif_transpose(source)
upright.thumbnail((40, 40))
upright.save("small.png")
検証用の60×100の結果は、縦横比を保った24×40になった。横長の保存ピクセルだけを前提に切り抜き位置を決める前に、向きをそろえておくと処理の意味を合わせやすいね。
向き情報がない画像まで、固定角度で回さない
同じ関数へOrientationのない画像を渡した検証では、100×60のサイズは変わらなかった。写真が横向きに見えるという理由だけで、すべて90度回す処理にすると、もともと正しい画像まで回してしまう。
出力がおかしいときは、元画像にタグがあるか、変換前後のサイズ、同じ画像に二度向き補正をかけていないかを確認しよう。出力の拡張子だけで、向きが直るわけでもないよ。
この手順は向き情報の処理を確認するもの。GPSや撮影日時など、すべてのメタデータの削除を保証する処理としては扱わないでね。公開前の情報の取り扱いは、向きの補正とは別に確認しよう。
トリミングの目的も整理したい場合は、画像のリサイズと切り抜きの違いも合わせて見てみよう。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。