はじめに
このページは、私が『F6 Exif』を作成する際に調査した内容をまとめたものです。
自分の覚え書きとして使っています。

『F6 Exif』のダウンロードはこちらです。
EXIFの内容を解析したい場合、こちらの機能も利用して下さい。

また、私の理解に基づき書いているので、誤りがあるかもしれません。
このページは暇を見つけて、更新していきます。
EXIF仕様
EXIFとは
EXIFとは"Exchangeable image file format"の略称。
EXIF仕様では画像ファイルのデータ構造、使用するタグなどが規定される。

※EXIF2.1仕様に沿った説明です。また、JPEGに限定しTIFF等の説明はありません。 
JPEGファイルの構造
JPEG関連で重要そうな規定は以下の通りです。
・JPEGフォーマットはBaseline形式とする。
・画像に対する付属情報(以降、EXIFデータと表記)の記録にはアプリケーション・データ・セグメント1(以降、APP1と表記)を使う。
・拡張データ(FlashPix?)の記録にはアプリケーション・データ・セグメント2(APP2)を使う。
・APP1は画像開始マーカー(以降、SOIと表記)の直後に記録する。
・APP1の内部構造は、APP1マーカー(0xFFE1)、APP1のレングス(2バイト)、EXIF識別コード("Exif\0\0")、EXIFデータで構成される。
 
EXIFデータの構造
EXIFデータには、撮影情報を中心に様々なデータを記録することが出来ます。
データ構造としては、以下に示す通りです。
・EXIFデータ構造は、TIFFヘッダ、Image File Directory(以降、IFDと表記)、サムネイル画像で構成される。
・データはTIFF Revision6.0に従いタグ形式で記録する。(詳しい内容は、下図を参照)

(クリックで拡大)
メーカーノートについて
メーカーノートとは?
メーカーノートとは大まかに以下のようなものです。
・機器メーカー毎の独自情報格納を目的としたEXIF仕様。
・格納位置はEXIF IFDに記録されタグは”0x927C”。
・データタイプはUNDEFINEDであり、データ構造やサイズについては規定がない。

※『F6 Exif』の解析できるメーカーノートは(株)ニコン製のデジカメ/ソフトで書き出されたメーカーノートのみです。
メーカーノートはやっかいもの
”メーカーノート”はEXIF編集ソフトを開発する上で結構やっかいなデータです。
データの性質上、多種多様なフォーマットが存在し、且つその仕様は公開されていません。
つまり、EXIF編集によりどのような影響を受けるか分からないのです。
メーカーノートのデータ管理にTIFFHEADERからのオフセット情報を使用するタイプのメーカーノートが多く存在します。
この場合、EXIF編集操作でメーカーノートのアドレスが変わってしまうとデータが正常に読み取れなくなります。つまり結果的にメーカーノート・データが破壊されます。
また、内部データのエンディアン形式がTIFFヘッダのエンディアンに従い記録される場合も多く、EXIF編集ソフトがエンディアンを変更するとメーカーノートが結果的に破壊されます。

上記の問題を回避する為の手段は以下の2通りです。
@.EXIF編集が行われるたびに、メーカーノート・データの整合性を保つようにデータを訂正する。
A.EXIF編集の際にエンディアンを変更しない、且つメーカーノートのアドレスを変更しない。

@の手段は、全てのメーカーノートの構造や仕様を理解しなければ成りません。つまりは、現実的には不可能です。
Aの手段は、メーカーノートの構造を知る必要がない為、現実的な手段です。
但し、0th IFDに大きなデータが追加されてしまった場合にはアドレスを固定出来ず、データ破壊が発生します。また、その他の要因でデータが破壊されるかもしれません。
つまり、完全な回避手段ではありません。

『F6 Exif』ではAの手段で対応しています。
EXIFデータを書き出す際に、元のエンディアンに従って出力します。また、メーカーノートのアドレスを変更しないように、EXIF IFD内の値の順番を入れ替えることで対応しています。(EXIF仕様は値の記録位置を規定しない為、エントリの値はエントリと同じ順序で記録する必要はありません)
0th IFDへのデータ追加によりアドレスを固定出来ない場合、『F6 Exif』では警告メッセージを表示しています。

こんなやっかいものなので、EXIFに対応するレタッチソフトなどでもメーカーノートだけは、削除、もしくは自分の情報で上書きしてしまうのでしょうね。
ニコン・メーカーノート構造と困った問題
基本的にニコンのメーカーノートはTIFFヘッダーとIFDにより構成されます。
IFDやタグの構造はEXIF仕様のものと同様です。
各タグで使用するエンディアンやオフセット値はメーカーノートの先頭にあるTIFF HEADERを基準にする為、EXIFデータのTIFF HEADERに影響を受けません。
また、EXIFのサムネイルとは別に独自のサムネイルを持ちます。画像サイズはEXIFのそれより大きめで機種によりサイズはまちまちです。

※念の為断っておきますが、これは私の解析結果に基づく為、大いに間違っている可能性があります。(^^;
データ構造
独自 HEADER(10バイト)
TIFF HEADER(8バイト)
撮影情報格納用 IFD
サムネイルデータ用 IFD
スキャン情報格納用 IFD
サムネイル画像データ(JPEG)

<<独自 HEADER>>
以下のいずれかの値が格納されている。
@NikonCaptureなどのソフトや、COOLPIX系のリトルエンディアン形式で記録する場合
0x4E
'N'
0x69
'i'
0x6B
'k'
0x6F
'o'
0x6E
'n'
0x00 0x02 0x00 0x00 0x00
ADXXXの一眼レフデジカメなどのビッグエンディアン形式で記録する場合に使用する
0x4E
'N'
0x69
'i'
0x6B
'k'
0x6F
'o'
0x6E
'n'
0x00 0x02 0x10 0x00 0x00

<<TIFF HEADER>>
EXIF仕様で使われるものと同じです。
ニコンのメーカーノートのエンディアンや、オフセットはこれを基準にします。

<<撮影情報格納用IFD>>
デジカメで撮影した情報や、基本構造の情報はここに収められます。
記録されるデータ量は多く、未だ全てを解析できていません。

また、サムネイルデータ用IFD、スキャン情報格納用IFDのアドレスはこのIFDのタグとして記録されます。

<<サムネイルデータ用IFD>>
EXIF仕様の1st IFD(thumbnail IFD)と同様の内容です。
サムネイルデータのアドレスやサイズを記録します。

<<スキャン情報格納用IFD>>
Nikon Scanなどで作成された画像に含まれ、スキャンした時の各種パラメータが保存されています。

<<サムネイル画像データ>>
JPEG形式のサムネイルです。EXIF仕様のサムネイル(160*120)より大きいサムネイルが保存されます。
Nikon Viewなどのサムネイル一覧ではこの画像が使われます。

ここで、困った問題があります。

通常、EXIF IFDに記録されるメーカーノートタグのサイズ(カウント)は上図の独自HEADER〜サムネイル画像データまでの全てを含みます。デジカメ撮影後は少なくともそうなっています。
これが、Nikon Captureで保存するとそのサイズは独自HEADER〜撮影情報用格納IFD迄と成ってしまいます。つまり、メーカーノートのカウントを信じてそのサイズだけ読み込み、保存などするとデータが欠損してしまうわけです。
メーカーノートの仕様は公開されていない為、不具合なのか正常な動作なのか分かりません。
『F6 Exif』では対応策として、必ずこのデータ構造に成っていると仮定してデータを読み込みます(タグのサイズは無視します)。これにより上記の状態でも欠損は発生しません。



Copyright (C)2006-2007 ryouto.jp. All Rights Reserved.