このエントリー
をはてなブックマークに追加
published on in JPEG
tags: JPEG Exif Orientation ExifTool

JPEG Exif Orientation の操作

JPEG Exif Orientation の操作

Orientation とは

JPEG には画像データそのものと別に Exif 形式で日付、撮影条件、場所といった情報をタグ形式で入れる事が出来ます。 その中に、画像を表示する時に行う回転を表す Orientation タグがあります。


引用: https://speakerdeck.com/yoya/jpegmeta

例えばカメラを横倒しにして撮影した場合は、カメラに映る画像データも横倒しに映ります。 撮影した時のカメラの向きを元に Orientation タグを付与する事で、表示する時に画像の向きを直す事ができます。

ImageMagick の identify コマンドで Orientation の値を参照出来ます。

$ identify -verbose orient-6.jpg | grep Orient
  Orientation: RightTop
    exif:Orientation: 6

Orientation の数値の対応

以下の画像は Orientation に各値を設定すると、全て 1 の向きに補正されて表示される画像です。(古いビューアだと補正しない事もあります)

早見表1

1: 2: 3: 4:
5: 6: 7: 8:

(補正で行う回転する向きでない事に注意。これらはその真逆です)

尚、画像の反転が定義されているのは、鏡のように映るインカメラ用だと思われます。[要出典]

こうして素直に 1 から順に並べてみると、

 * 1 を基準として、
 * 1の左右反転 => 2 、1の上下反転 => 4、 1の左右と上下反転 => 3、
 * 1,2,3,4 各々を斜め軸で反転 => 5,6,7,8

となっていて、右回転、左回転の定義が不要なのが面白いです。尚、1を引くとビット毎に、どの軸で鏡像回転するかのフラグになります)

これらは処理系の都合であって、実際には以下のように利用されます。

 * 1 を基準として、90度回転 => 8, 180度回転 = 3, 270度回転 => 6
 * 1 の鏡反転 => 2、8 の鏡反転 => 5, 3の鏡反転=> 4、6 の鏡反転 => 7

早見表2

変換の方向がわかりやすい図もつけます。

Orient 画像の実データ Exif-Orient を解釈して表示
1
2
3
4
5
6
7
8

編集ツール

Exif タグはツールを使って自由に入れ替えができるので、Orientation 検証画像を自分で作る事が出来ます。

ExifTool が便利なのでこちらを使う事にします。

ExifTool

インストール

MacOS は

$ brew install exiftool

Debian Linux は

# apt-get install exiftool

でインストールできます。

Perl なので他のプラットフォームでも入れるのは難しくないでしょう。

ExifTool の使い方

Orientation は以下のコマンドで書き換えられます。

$ exiftool -Orientation=6 -n test.jpg
test.jpg
    1 image files updated

まとめて 1〜8を設定する

ついでに表示の時に元の画像の向きを維持するようにします。

#! /bin/bash

set -u

ORIGINAL_SUFFIX="_original" # exiftool の-delete-original が動かないので
SUFFIX=".jpg"

FILE=$1
PREFIX=`basename $FILE $SUFFIX`

for i in `seq 1 8` ;
do
  FILE_ORIENT="$PREFIX-$i$SUFFIX"
  echo $FILE_ORIENT
  cp $FILE $FILE_ORIENT
  exiftool -Orientation=$i -n $FILE_ORIENT
  rm $FILE_ORIENT$ORIGINAL_SUFFIX
  case $i in
    "2") mogrify             -flop $FILE_ORIENT ;;
    "3") mogrify       -flip -flop $FILE_ORIENT ;;
    "4") mogrify             -flop $FILE_ORIENT ;;
    "5") mogrify -rotate  90 -flop $FILE_ORIENT ;;
    "6") mogrify -rotate -90       $FILE_ORIENT ;;
    "7") mogrify -rotate -90 -flop $FILE_ORIENT ;;
    "8") mogrify -rotate  90       $FILE_ORIENT ;;
  esac
done
  • 実行
$ severalorientation.sh orient.jpg
$ identify -verbose orient-?.jpg | grep Orient
  Orientation: TopLeft
    exif:Orientation: 1
  Orientation: TopRight
    exif:Orientation: 2
  Orientation: BottomRight
    exif:Orientation: 3
  Orientation: BottomLeft
    exif:Orientation: 4
  Orientation: LeftTop
    exif:Orientation: 5
  Orientation: RightTop
    exif:Orientation: 6
  Orientation: RightBottom
    exif:Orientation: 7
  Orientation: LeftBottom
    exif:Orientation: 8
  • 結果
1: 2: 3: 4:
5: 6: 7: 8:

テーブルの中では傾いてますが、画像をクリックすると向きが補正された画像が出ます。(テーブルに表示するのもクリックして表示されるのも同じ JPEG 画像です)

ちなみに、前半の方の表に貼り付けた画像は、更に

for i in *-?.jpg ; do
  o=`basename $i .jpg` ;
  convert -strip $i $o-strip.jpg;
done

として Exif タグを削除したものです。

参考 URL