APP1マーカ (0xFFE1)以降、SOS (0xFFDA)の直前までがAPP1領域と呼ばれ、EXIFの画像以外の付属情報が格納されている。ここには、APP1全体のバイト数(最大で64K)、Exifヘッダ、TIFFヘッダと続き、情報本体であるIFD (Image file directory)領域となる。
先頭部分をまず見てみると、具体的には、
SOI | 0xFFD8 | |||
APP1 Marker | 0xFFE1 | |||
APP1 data | サイズ | 0xSSSS | ||
Exif識別子 | 0x45 78 69 66 00 00 | 'E','x','i','f',0,0 | ||
TIFFヘッダ | ||||
Byte order | 0x4D4D | 'M','M' | ||
42 | 0x002A | (固定) | ||
0th IFDへのオフセット | 0x00 00 00 08 | 直後に0th IFD | ||
0th IFD | ||||
: |
実際のExifデータでみると、下図のようにSOI(0xFFD8)で始まり、APP1マーカ(0xFFE1)、APP1サイズ(0x1629=5673)と続く。このサイズだけ先を見てみると、その次の図のように$162D(=$0004+$1629)からは次のAPP1マーカ(0xFFE1)は続いている。
APP1サイズに続いてExifヘッダ('E','x','i','f',0,0)、TIFFヘッダ(ここでは'M','M',0,0x2A,0x00000008)が続き、モトローラ形式でこの直後から最初のIFD (0th IFD)が置かれている。
IFD (Image file directory)領域はAPP1領域内で情報を格納している部分で、複数のIFDからなる。IFDの構造は規格で定義されている。標準IFDの他、メーカ独自の情報を格納するMakerNote IFDがある。但し、MakerNoteはIFD形式であるとは限らない。
IFDは、頭にそのIFDに存在する要素(ディレクトリ・エントリ)の数N(2バイト)があり、その数だけディレクトリ・エントリ(12バイトずつ)が続く。最後に、次のIFDへのリンクポインタ(4バイト)がある。リンクポインタが0の場合は、次のIFDがないことを示す。必要なら、そのIFDのデータ領域が続く。
エントリ数(2 bytes) N |
|
|||
ディレクトリ・エントリ #0 | ||||
タグ番号 (2 bytes) |
データ形式 (2 bytes) |
データ個数 (4 bytes) |
データ値 or データへのオフセット (4 bytes) |
|
ディレクトリ・エントリ #1 | ||||
タグ番号
(2 bytes) |
データ形式 (2 bytes) |
データ個数 (4 bytes) |
データ値 or データへのオフセット (4 bytes) |
|
: |
: |
: |
: |
|
ディレクトリ・エントリ #N-1 | ||||
タグ番号
(2 bytes) |
データ形式 (2 bytes) |
データ個数 (4 bytes) |
データ値 or データへのオフセット (4 bytes) |
|
次のIFDへのオフセット(4 bytes) |
|
図中、タグ番号については後掲の表を参照されたい。データ形式は次の表を参照されたい。各ディレクトリ・エントリの最終フィールドは、データが4バイト以下ならデータそのものであり、4バイトを超える場合はデータへのポインタとなる。ポインタ表現は、4バイトのエリアに左詰めで、つまりバイトオフセットの小さい領域から値を納める。例えば、ビッグエンディアン形式でタイプがSHORT、値が1の場合には0x00010000を記録する。ポインタはTIFFヘッダから数えた値となる。
値 | データ形式 | Bytes/component | 備考 |
1 | unsigned byte | 1 | |
2 | ascii strings | 1 | NULLで終端 |
3 | unsigned short | 2 | |
4 | unsigned long | 4 | |
5 | unsigned rational | 8 | 分子、分母の順 |
6 | signed byte | 1 | |
7 | undefined(任意) | 1 | |
8 | signed short | 2 | |
9 | signed long | 4 | |
10 | signed rational | 8 | 分子、分母の順 |
11 | single float | 4 | |
12 | double float | 8 |
[注] データ形式unsigned long (#4)については、データ個数が1であってもデータ・フィールドが値を示すとは限らない。実際、ExifIFDPointerやGPSInfoIFDPointerはポインタ(オフセット)が格納されている。