DESIGN / CODE / INFRA / AI

解説

写真が横向きになる?Exifの向きを反映してから画像を縮小しよう

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

写真が横向きになる?Exifの向きを反映してから画像を縮小しよう
保存リストを見る →
この記事の道しるべ 4項目

写真アプリでは縦向きなのに、変換した画像が横向きになることがある。保存されたピクセルの幅・高さだけでなく、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

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。