SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

Exif情報を使って画像の向きを修正する(Orientationタグ対応)

問題

携帯電話で撮った写真って、縦向き、横向きがむちゃくちゃみたいなんだけど、向きをそろえるのは無理?

解答例

携帯電話のカメラなどで撮影した画像は、OrientationタグというExif情報が付与されていることがあるようだ。

通常、デジカメをどちらに向けて撮影しても、画像の上はカメラの上と一致している。

一方、撮影者から見た実際の向きは、カメラをどっちに向けているかを考慮しなくてはならない。撮影者がカメラを右に90度回転させて撮影したら、撮影者が見ている映像を再現するは、カメラに写った画像を右に90度回転させる。

カメラの向きと画像データの向きは通常一致するが、写真の向き(どう見えて欲しいか)と画像データの向きは一致しないことがある(カメラを横に向けたりすると)。

Orientationタグは、そんなカメラの向きを教えてくれる情報と言える。

(私の)携帯電話は、縦向きに構えたとき、通常のカメラでは右に90度回している状態と考えればよいらしい。元の画像データは横長(640×480など)で記録されるようになっている。携帯電話の画面は縦長で、撮影時も閲覧時も、カメラに写った画像を90度回転した状態で画面に表示している状態である。

※ ただし、携帯で小さいサイズ(240×320など)で撮影すると、小さい縦長の画像のデータになることが多いらしい。このときOrientationタグで方向の指定はないので、回転して補正する必要もない。

つまり

Exif情報のOrientationタグの指定に従うと、携帯で撮影した写真はすべて縦長の携帯画面に合った方向に調整できる、はず。

逆に携帯の画面で見るつもりで撮ったわけではない画像(横向きで見るつもりの画像)まで縦向きになる可能性が考えられるが、そのへんは設定などに応じてよい具合に調整してくれると期待しよう。

わざわざExif情報にOrientationタグが付与されているときは、それに従って補正して間違いないであろう。

やってみる

jpegtranコマンドでjpeg画像のロスレス回転ができるらしいので使ってみる。

Orientationには、回転4種類(0度,90度,180度,270度)と正像、鏡像の2種類の掛け合わせで8種類ある。

Orientationを読み出して、撮影者が見た向きに直してみる。

Orientation=1 のとき → そのまま

何もしなくてよい

Orientation=2 のとき → 左右の鏡像(デジカメでは普通ないけど…)

jpegtran -flip horizontal inputfile > outputfile

Orientation=3 のとき → 180度回転。カメラを上下ひっくり返して撮った

jpegtran -rotate 180 inputfile > outputfile

Orientation=4 のとき → 3+鏡像

jpegtran -rotate 180 -flip horizontal inputfile > outputfile

Orientation=5 のとき → 6+鏡像

jpegtran -rotate 90 -flip horizontal inputfile > outputfile

Orientation=6 のとき → 右に90度回転(携帯電話内臓カメラでよくある?)

jpegtran -rotate 90 inputfile > outputfile

Orientation=7 のとき → 8+鏡像

jpegtran -rotate 270 -flip horizontal inputfile > outputfile

Orientation=8 のとき → 右に270度回転

jpegtran -rotate 270 inputfile > outputfile

参考

ExifのOrientationタグについて。

http://sylvana.net/jpegcrop/exif_orientation.html

http://www.impulseadventure.com/photo/exif-orientation.html

関連するメモ

コメント