EXIFとレンズ

昔はついていなかったけれど、今はデジタル一眼(レフ)カメラで撮影した写真のメタ情報である EXIF にレンズの情報が乗っているらしい。 EXIF 規格本体に追加されたのは最近みたいで、カメラメーカーがやる気がないため まだ Maker Note に格納されるのも多いようだ。

EXIF のどのタグに乗っかるのかはメーカーというかカメラによって異なる。 EXIF の最近の規格だと LensMake(A433.H),LensModel(A434.H),LensSerialNumber(A435.H) なるものがあって、それで見れる。 例えば、exiv2(1) を使って、下記コマンドで簡単に見れる。( 出力は Canon EF 85mm f/1.2L II の場合 )

% exiv2 -g Exif.Photo.LensModel FOOBAR00000.jpg
Exif.Photo.LensModel                         Ascii      21  EF85mm f/1.2L II USM

カメラに依るが Make Note にしか載っていないものでも exiv2 が対応していれば見ることができる。 ただExif.Canon.LensModelといったようにキー (Exiv2 key)を適切なものに変える必要が有る。 あと、当然ながらレンズ取り換えの出来ないコンデジや携帯電話・スマホはそもそもレンズ情報を格納していないようである(焦点距離とかの光学的な情報は乗っけてくれているので問題にはならない)。

「レンズ付け替え大変そうだなぁ」としみじみ思うために

デジイチで取った写真をいっぱいもらった時に、

  1. 写真の撮影日時、レンズ名称をリスト化し、
  2. 撮影日時でソートすれば、
  3. レンズ名称が変わったところでレンズを付け替えたのがわかる!

そしてその付け替えタイミングや回数を見れば、標題どおりレンズ付け替えを大変そうだなぁとしみじみ思うことができるのではないか? ――ということで以下のシェルスクリプトを作った。 Exif.Photo.LensModel から取得できない時は Maker Note を見て試してみるようにしてある。

#!/bin/sh

for i in `find . -iname "*.jpg"`; do
  cap_time=`exiv2 -g Exif.Photo.DateTimeOriginal -Pv $i`
  lens_name=`exiv2 -g Exif.Photo.LensModel -Pv $i`
  if [ "x$lens_name" == "x" ]; then
    lens_name=`exiv2 -g Exif.Canon.LensModel -Pv $i`
  fi
  if [ "x$lens_name" == "x" ]; then
    lens_name=`exiv2 -g Exif.MinoltaLensID -Pv $i`
  fi
  if [ "x$lens_name" == "x" ]; then
    lens_name=`exiv2 -g Exif.Panasonic.LensType -Pv $i`
  fi

  echo $i,$cap_time,$lens_name
done

上記を適当な名前で保存して(仮に ichigen_taihen.sh とでもする)画像ファイルがあるディレクトリをカレントディレクトリとして、 下記を実施すると CSV 形式でファイル名、撮影日時、レンズ名のリストがでてくる。 そう、撮影日時のソートはだるいので ichigan_taihen.sh の外側で sort(1) をパイプで繋げてやっている。

 % path_to/ichigan_taihen.sh | sort -t, -k 2

あとは、眺めるだけ。

ただ、「デジイチのレンズ付け替えを大変そうだなぁ」と思うのに必要な「他人がレンズを変えまくって撮影した写真(しかも EXIF が付いたレタッチ前のもの)」が筆者の手元にないのが目下の問題である。

参考文献