EXIFミニ知識
EXIFとは
ディジタルスチルカメラ用画像ファイルフォーマット規格 Exchangeable image file format の略で、JEIDA(2000年にEIAJとの合併により現在はJEITA)においてディジタルスチルカメラおよびこれに関連するシステムで利用される画像ファイルフォーマットとして1995年に規定された(Ver1)もの。 画像ファイル自体についての情報の他、撮影条件や画像のタイトルや著作権等、関連音声ファイル情報、GPSによる撮影位置情報などを画像ファイルの中に保持することが出来る。
ところで、撮影情報などは、デジタルカメラで撮った写真ならば、ほぼ自動的にファイルに記録されるが、タイトルは自分で入れるしかない。写真にタイトルやちょっとしたコメントを付しておくと、後で写真を見たときの楽しさがずっと大きなものになることは多くの方が経験していることと思うが、画像に標題はそれが簡単にできてしまう。
EXIFの記録フォーマット
1.JpegとExif
ExifではJpegフォーマットのアプリケーション・マーカセグメント1(APP1)を利用してデータが記録されている。これを図示すると以下のようであるが、APP2以降の例にはadobe(APP13)などがある。なお、Exif規格ではAPP2はフラッシュピクス用に使用されることとなっている。
2.Exifデータ(APP1)の構造
最初のAPP1マーカとAPP1レングスはJpegの規約により、前者はFFE1という2バイトのデータ、後者はマーカ以降のデータ長でx0002〜xFFFFの2バイトデータである。このことからExifデータは最大でも64kバイト以内でなければならないこととなる。なお、マーカとレングスは常にビッグ・エンディアン(*1)で記録される。
次のExif識別コードはExifという4バイトの文字列+0000の2バイト、次のTIFFヘッダはExifデータの記録形式がビッグ・エンディアンかリトル・エンディアン(*1)かを示す記号で前者のときはMM、後者はIIの文字列2バイト
+ x002Aの2バイト +
TIFFヘッダからの0thIFDの始まりまでのバイト数(IFDオフセット、0バイトから数える)4バイトからなっている。具体例を示すと次のようなものだ。
例1:FF E1 01 23 45 78 69 66 00 00 49 49 2A 00 08 00 00 00 この後0thIFD
例2:FF E1 01 23 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08 この後0thIFD
ここから先はTIFFのIFD(Image File Directory)フォーマットに従ってデータが記録される。これは
データ識別タグ2バイト+データタイプ2バイト+データ数4バイト+データ4バイト
という12バイトの固定長データの集まりで、先頭にこれが何個あるかを2バイトで、末尾に1stIFDの先頭記録位置を4バイトで記録したものである。
ここで重要なことは、実データの記録フィールドが4バイトしかないことで、実データが5バイト以上の場合には、別な場所にそれを記録してここにはその記録位置が先ほどのTIFFヘッダから何バイト離れているか(オフセットという)を4バイトで記録する。このため、Exifデータはどこか1つのデータの長さが変化すると、変更のないデータもその記録位置が変わるので、単純にデータをコピー&ペーストするだけではだめということになる。なお、1stIFDの記録位置も同様のオフセット値により記録される。
以上のことから、n個のデータからなる1かたまりのIFDは、(2+n×12+4)バイトになる。Exifデータには0thIFDの他にもこのようなIFDが0〜4つ存在する。なお、1つのIFDの中では、タグ番号は昇順に並ぶ。
ExifIFD:
撮影条件データなどが記録される。ExifIFDを記録する場合は0thIFDのデータの中にExifIFDの記録位置(オフセット)を示すデータを含める。
GPSIFD:
撮影場所に関するGPS情報などが記録される。GPSIFDを記録する場合は0thIFDのデータの中にGPSIFDの記録位置(オフセット)を示すデータを含める。
互換性IFD:
Exifの旧バージョンとの互換性のための情報が記録される。これを記録する場合はExifIFDのデータの中に互換性IFDの記録位置(オフセット)を示すデータを含める。
1stIFD:
サムネイル画像に関連した情報が記録されるもので、1stIFDの記録位置は0thIFDの末尾にそのオフセットが記録される。
(*1)ビッグ・エンディアンとリトル・エンディアン:
一般にコンピュータでデータを記録するときは1バイト(8ビット)ずつ記録されるが、大きな数を記録しようとすると1バイトでは記録しきれないこととなる。例えば16進数の1234は2バイトあれば記録できるが、これを1バイトずつ記録する場合に12−34の順に記録するか、34−12の順に記録するかの2とおりの方法が考えられる。桁の大きい方から記録する前者をビッグ・エンディアン(つまり大端族)、反対の後者をリトル・エンディアン(つまり小端族)という。
前者は記録の標記が数字の標記と同じになるので見やすいわけで、一方後者は順に読み出して値をソロバンにセットすることを考えたときに桁を意識せずに順に置いていけばよいというメリットがある。一般にインテル系プロセッサは後者で処理され、モトローラ系プロセッサなどは前者で処理される。
ビッグ・エンディアン、リトル・エンディアンというのは、スイフトの「ガリバー旅行記」の第1話である「リリパット国(小人国)」の中に、卵を食べるときに昔からの習わしどおり大きい端を割って食べる人たち(ビッグ・エンディアン、カトリック教徒のことといわれている。)と、先の皇帝(ヘンリー8世のことといわれている。)のおふれに従って小さい端を割って食べる人たち(イギリス国教徒といわれている。)とが争いが絶えないという話があるところから由来しているともいわれている。
3.EXIFで記録されるデータのデータタイプとデータ数
データタイプには次のような種別があり、タイプの番号が前述のIFD第2フィールドに2バイトで記録される。
タイプ | 名 称 | 説 明 |
1 | BYTE | 8 ビット符号無し整数 |
2 | ASCII | 一つの7 ビットASCII コードを納めた8 ビットバイト。最後のバイトはNULLで終端す る。ASCII のカウントはNULL も含めた値とする。 |
3 | SHORT | 16 ビット(2 バイト)符号無し整数 |
4 | LONG | 32 ビット(4 バイト)符号無し整数 |
5 | RATIONAL | LONG2 個。最初のLONG は分子、2 個目のLONG は分母を表す。 |
(6) | (SBYTE) | (8 ビット符号付き整数) |
7 | UNDEFINED | フィールドの定義により、どんな値をとっても良い8 ビットバイト |
(8) | (SSHORT) | (16 ビット(2 バイト)符号付き整数) |
9 | SLONG | 32 ビット(4 バイト)符号付き整数(2 の補数表現) |
10 | SRATIONAL | SLONG2 個。最初のSLONG は分子、2 個目のSLONG は分母を表す。 |
(11) | (SFLOAT) | (32 ビット(4 バイト)浮動小数点数) |
(12) | (DFLOAT) | (64 ビット(8 バイト)浮動小数点数) |
データ数は、上の表で示されるデータ何個からなっているかを4バイトで記録する。データタイプが1、2、7のときはデータ数が2ならば合計2バイトであるが、データ数が2でもデータタイプが3なら合計4バイト、データタイプ5なら16バイトになる。
4.EXIFで記録されるデータのデータ項目(タグ)の種類
タグ名称の*マークは画像に標題で編集可能(特定の値への変更のみを含む)な項目
|
|
|
|
メーカーノートについて:メーカーノートの中の記録内容や記録形式については、全てメーカーに任されているので、一定の形式はないが多くの場合はIFD形式で記録されている。その場合でもオフセットの基準位置がExifのTiffヘッダーでないものやIFDブロックの最初に識別IDがあるなど一様ではない。なお、画像に標題ではかなりの精度でメーカーノートの形式を判別して処理が出来る。
|
|
互換性IFDのタグ
タグ名称:互換性識別子、タグ番号:1、データタイプ:2、データ数:Anyの1つだけである。
|
|
* サムネイルが非圧縮点順次画像の場合はそのストリップ数 など
○公式のEXIF規格書(CIPAへリンク)
(注)記載内容には十分注意をしたつもりですが、勘違いやミスタイプ等により誤りがあった場合はご容赦下さい。