Last modified: Sat Feb 25 22:16:01 JST 2006

ExifInfo.pl
〜Exif 情報取得サブルーチン〜

[目次| ホーム]

ダウンロード

拡張子が pl なファイルは実行させようとしてしまうみたいですので '.pl' ではなく '_pl' に変更してあります。実際に利用するときにはリネームしてご利用下さい。

公開日 ファイル名 ファイルサイズ 内容
2006/02/15 ExifInfo.pl 63.3kB ライブラリ
2006/02/25 MakerNote20060127.tar.gz 29.5kB MakerNote プラグイン
2006/02/25 MakerNote20060127.zip 42.6kB MakerNote プラグイン

説明

プログラムとしての利用

ExifInfo.pl は単体でプログラムとしても利用できます。使い方は

ExifInfo.pl [-A] [-d] [-h] [-j] 画像ファイル...

です。オプションなしでも動作します。また、画像ファイルが複数しても 構いません。Exif 情報は標準出力に書き出されます。オプションの意味は 以下の通り。

オプション説明
-A2つ目の Exif 情報を読みません。 Photoshop で編集した画像ファイルは Exif 情報を仕様に準拠した書式と XML 形式の書式の2種類の記録をします。ExifInfo.pl では両方の情報を 読み込みますが、このオプションをつけることにより XML 形式の処理を しません。普段はこのオプションは必要ないのですが、XML の処理が 適当なため、たまにハングアップする可能性があります。その時は このオプションをつけて実行してみてください(そしてバグ報告をして 下さい)。
-dデバッグモード。対応表などで整形した値ではなく、 タグの値を含め生データを出力します。
-h簡易ヘルプを表示します。
-j日本語で結果を表示します。

オンラインヘルプを見れば分かりますが、実はまだいくつかオプションがありますが、 私の開発用のものです。通常は上のオプション、特に -j オプションだけを 使うことになると思います。

ライブラリとしての使用 (その 1)

Exif 情報を読むサブルーチン。

%ExifInfo = &InquireExif( $FileName );

とすることにより %ExifInfo に Exif情報を取得します。ハッシュのキーは Exif のタグ番号(10進)となっています。値はタグ番号に対応する Exif 情報の 生データとなります。生データがそのまま値の場合(時刻情報など)はこの 値を利用すればよいですが、フラッシュの情報など対応表が必要な場合は $ExifTAGDesc->{$lang}->{$TAG}->{$ExifInfo{$TAG}} にデータが記述されて います。$lang は表示言語で 'en' の場合英語表記、'ja' の場合日本語表記 となります。$TAG はタグ番号を表します。

Exif 情報の一覧を表示するには

%ExifInfo = &InquireExif( $FileName ); &WriteExifTAG( FILE, $lang, %ExifInfo );

のようにサブルーチン WriteExifTAG を利用します。引数は順に Exif 情報を出力するファイルのファイルハンドル、 表示言語(en or ja)、 Exif 情報を取得したハッシュとなります。 また、これらをまとめた

&PrintExifInfo( FILE, $lang, $FileName )

というサブルーチンもあります。このスクリプトはサンプルプログラムが上部に ついていますので、Exif 情報を取得するプログラムとして利用可能です。 サブルーチンとして利用したい場合にはその部分を削除してご利用下さい。

定義されているグローバル変数について

ExifInfo.pl 内部で定義されている変数について紹介します。最初に紹介する 変数は BEGIN 部分で定義されているもの及びメーカーノートプラグインにより 定義される情報です。これらの変数は通常特に変更する必要はないと思います。

変数名 解説
@lang Exif 情報の対応表のある言語の配列。現在のところは 'ja' と 'en' があります。__DATA__ 以下の表に | 区切りで追加すれば言語を 追加することが可能です。
$debug_write 1 の時、WriteExifTAG 関数により情報を出力する際、生データを 出力するようにします。
$maker_note 1 の時、Exif 情報の Maker Note 部分とそれが埋め込まれている APP1 マーカー全体を取り出します(開発目的)。
$app1_2nd 1 の時、JPEG ファイルに 2つ以上 APP1マーカーがある際にその データもチェックします。Photoshop のデータの場合最初の APP1 マーカーの部分に通常の Exif 情報を、次の APP1 マーカー部分 に独自情報を埋め込むようです。現在公開されている ExifInfo.pl では、この独自情報も処理をしています。
$cache_size データを読む際、一度キャッシュにためてから処理をしますが、 そのサイズを指定します。デフォルトでは 16384(16kB)。
@ExifMaker メーカーノート情報に関するプラグイン情報 (内部独自情報)
@ExifModel メーカーノート情報に関するプラグイン情報 (内部独自情報)
@ExifMakerKey メーカーノート情報に関するプラグイン情報 (内部独自情報)
@ExifSubKey メーカーノート情報に関するプラグイン情報 (内部独自情報)
@ExifMakerID メーカーノート情報に関するプラグイン情報 (内部独自情報)
@ExifABBR メーカーノート情報に関するプラグイン情報 (内部独自情報)

続いて、サブルーチンとして使用する際に利用すると思われる変数について紹介を します。Exif情報はタグと呼ばれる ID 番号と、それに対応する値が画像の中に 埋め込まれているものです。ID 番号が何を表しているかを知る必要があるのですが、 それが %ExifTAGen, %ExifTAGja というハッシュに定義されています。前者が英語表記、後者が日本語表記となります (@lang で定義された文字が付加されています)。 また、タグ ID 番号に対応する略称も %ExifName というハッシュに定義されています。Exif 情報はさらに値が対照表を必要とする 場合もありますのでその対応表が %ExifTAGDesc に記述されています(%ExifTAGDesc 自体は無名ハッシュ)。

ライブラリとしての利用例 (その 2)

最初の方にも簡単な使い方を書いておきましたが、もう少し詳しく利用方法を 紹介します。まず Exif 情報を取得します(これは上の例と同じ)。

%ExifInfo = &InquireExif( $FileName );

取得した Exif 情報の中から「露出時間」のデータを表示してみましょう。 せっかくですのでタイトルもつけてみましょう。露出時間情報に対応する タグは 33434 ですので

print "$ExifTAGja{33434} :: $ExifInfo{33434}\n"; print "$ExifTAGen{33434} :: $ExifInfo{33434}\n"; $id = $ExifName{ExposureTime}; print "$ExifTAGja{$id} :: $ExifInfo{$id}\n";

のようにすれば表示されます。1番目はタイトルを日本語で表示をするのに 対して2番目は英語で表示をします。また、3番目はタグ番号ではなく、略称を 利用した方法の例となります(最初に略称から ID 番号を取得している)。 スクリプト的には3番目の方が可読性は上がると思います。

すでに書きましたように、Exif 情報には埋め込まれている値を対照表と照らし 合わせる必要があるものもあります。例えばフラッシュ情報 (タグ番号 37385, 略称 Flash)の出力をする 場合、

print "$ExifTAGja{37385} :: $ExifTAGDesc->{ja}->{37385}->{$ExifInfo{37385}}\n"; print "$ExifTAGen{37385} :: $ExifTAGDesc->{en}->{37385}->{$ExifInfo{37385}}\n"; $id = $ExifName{Flash}; print "$ExifTAGja{$id} :: $ExifTAGDesc->{ja}->{$id}->{$ExifInfo{$id}}\n";

のように %ExifTAGDesc で定義されている対応表を 用いて表示をします。

メーカーノート情報について

メーカーノート情報は ExifInfo.pl のみでは表示することは出来ませんが、 プラグインを用いることにより表示可能になります。MakerNote.tar.gz を 展開すると maker_note というディレクトリが作成されます。このディレク トリを実行プログラムと同じディレクトリに置いてください。例えば ~/bin に ExifInfo.pl があり、このスクリプトを実行する場合には ~/bin/maker_note があれば ExifInfo.pl 実行時にメーカーノート情報も表示します。 プラグインのありかは $0/maker_note/ を読み込みますので、 ExifInfo.pl をサブルーチンとして別スクリプトから require 文で読み込む 場合、ExifInfo.pl のあるディレクトリに置くのではなく実行スクリプト本体と 同じディレクトリにプラグインを置くという事になります。 また、プラグインの置き場を別の場所に置きたい場合は ExifInfo.pl の BEGIN{ } 部分の $makernotedir を自分の環境に合わせて編集してください。

メーカーノート情報は現在のところほとんど完成していません。対応次第 更新していきたいと思います。また、メーカーノート情報を把握している ユーザさんは、その部分だけを記述することにより ExifInfo.pl を変更することなく 独自に追加することが可能です(出来ればその結果を私にフィードバック してくださるとありがたいです)。プラグイン作成方法はいずれ書きたいと 思いますが、簡単な文章は MakerNote(日付).tar.gz に同梱の README.txt を 参考にしてください。

メーカーノート解析支援として maker_note ディレクトリの中に ExifDump.pl を用意しました。詳しくは maker_note ディレクトリ以下の README.txt を ご覧下さい。

独自のタグ定義について

Exif のタグ番号は当然ですが重複してはいけません。しかしながらメーカー 独自タグなどにより重複をしてしまう可能性があるため、ExifInfo.pl では 重複の恐れがあるものは番号を振り直しています。以下に独自タグ番号の 紹介をします。

タグ番号説明
1000000〜1000030 GPS 関連のタグ。オリジナルの番号に 1000000 を足した
3000000番台 Photoshop CS RAW 現像独自情報
3100000番台 OLYMPUS
3200000番台 PENTAX (*istD)
3300000番台 CASIO (EX-P600)
3400000番台 PENTAX (Optio)
3500000番台 Nikon (D70/E990)
3600000番台 Nikon (Exxx)
3700000番台 MINOLTA (DiMAGE)
3800000番台 SIGMA (SD10)
4000000番台 CANNON (EOS)
4600000番台 FUJIFILM
9900000番台 CASIO (A5403CA)

Exif タグ一覧

ExifInfo.pl で利用可能なタグ一覧を別ページに載せましたので 参考にして下さい。Exif で定義されているものの他に 統一 RAW 形式である DNG で定義されたタグやメーカーノートの ために独自に定義したタグも載せています。略称や日本語表記、英語表記に 誤りやこちらの方がよいというものがありましたらご連絡下さい。 特にまだ日本語表記が完成していないところがありますので ご協力下さい。

RAW ファイルについて

一部の RAW ファイルのデータも読めるようになりました。現在のところ確認している メーカー及び機種名は

です。基本的に同じメーカーであれば異なる機種であっても読める可能性が 高いです(ただし、EOS 10D、G1、G2 は読めません)。 ここに書かれていないメーカーでも読めるかもしれません( TIFF 形式で 書かれている RAW ファイルは確実に読めると思います)。もし、読めた場合 には連絡を頂ければ一覧に追加します。また、読めなかった場合はファイルを送って いただければ対応できるかもしれません。RAW ファイルを送る方法は指定しますので、 まずメールにて方法を確認をして下さい。間違ってもいきなりメールに添付しないで 下さい。

カスタマイズ

対応表を編集することによって表示する値を変えることが出来ます。作者の表現が 気に入らない場合には独自に編集するとよいでしょう。対応表は __DATA__ 以下の 行に書かれています。

<exiftag>〜</exiftag> の部分
最初の行からタグ番号、略称、日本語によるタイトル、英語によるタイトル の順で書かれています。タグ番号と略称は編集しないでください。もし、 日本語と英語以外の言語を追加したい場合は | 区切りで後に追加し @lang に その言語情報を追加します。
<exifval>〜</exifval> の部分
最初の行からタグ番号、値、値に対応する情報の日本語表現、最後にその英語 表現となります。タグ番号と値は編集しないでください。 <exiftag> の時と同様日本語と英語以外の言語を追加 したい場合は | 区切りで後に追加し @lang にその言語情報を追加します。

使用上の注意

配布時 ExifInfo.pl の文字コードは EUC です。Windows 等で利用のため Shift-JIS にコード変換をして利用をすると文字化けが発生する可能性があります。その際、 以下の対処をすることによって文字化けを回避することが可能になります。

  1. jcode.pl を用意する
  2. require 'jcode.pl' を追加する
  3. $code という変数に出力する文字コードを定義する (euc,jis,sjis のいずれか)
  4. サブルーチン ExifReadTagInfo でコメントされている行すべて 有効にする(# を削除する)

1. 〜 3. までは特に ExifInfo.pl 内に記述する必要はありません。呼び出すメインの スクリプトに記述をしても構いません。

更新履歴

2005/07/04
2005/03/27
2004/12/13
2004/12/08
2004/12/03
2004/11/30
2004/11/28
2004/09/03
2004/09/01
2004/08/28
2004/08/09
2004/08/01
2004/07/19
2004/07/18
2004/05/03

cachu@cachu.xrea.jp