Pythonでスマホで撮った写真の向きを補正する

リアルタイムスライドショーアプリを作って、披露宴で使った話の続きです。

この自作アプリでは、スマホで撮影してもらった画像をスライドショーに投影しています。しかし、無補正では写真の天地が揃っていませんでした。

そのため、この記事を参考に向きを補正しました。

なぜ向きがずれるのか?

カメラで撮影された写真は、撮影時の様々な情報をExifという規格にメタデータとして保存しています。このExifの中に撮影時の向きの情報が含まれています。

最近のビューワーだとこのExif情報を参照し、正しい向き情報を取得して画像表示を行うようですが、ブラウザ上で<img>で表示しようとするとメタデータ情報を参照してくれないようです。

参考

chromeなら、<iframe>を使えば補正してくれるようですが、全てのブラウザに適用させるにはやはり画像自体を補正させる必要がありそう。

ということで、pythonで補正を行いました。

Pythonによる向き補正

以下の情報はすべて参考先に乗っていますので、ここではピンポイントで情報記載します。

まずは画像操作用モジュールをインストール。

Pillowモジュールを利用します。

pip install Pillow

画像の向き情報はExif情報内のOrientation要素に記載されています。この値を変更することで向きを補正します。

以下が対応表です。 Orientationに以下の補正番号を与えて画像を補正させ、正しい向きに直します。

画像 Orientation 補正内容 補正番号
f:id:yason0319:20200726105938p:plain 1 - -
f:id:yason0319:20200726110139p:plain 2 左右反転 0
f:id:yason0319:20200726110153p:plain 3 180°回転 3
f:id:yason0319:20200726110200p:plain 4 上下反転 1
f:id:yason0319:20200726110209p:plain 5 上下反転+270°回転 5
f:id:yason0319:20200726110215p:plain 6 270°回転 4
f:id:yason0319:20200726113029p:plain 7 左右反転+90°回転 6
f:id:yason0319:20200726113039p:plain 8 90°回転 2

Pillowモジュールでは、Image.transpose(補正番号)でOrientationの更新ができます。

# Orientation番号に合わせて、補正番号を設定する
trans_ = [0, 3, 1, 5, 4, 6, 2][orientation_ - 2]

if orientaion_ > 2 :
  Image.transpose(trans_)

このImageを上書き保存してあげれば、補正完了です。