APP1領域

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領域

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はポインタ(オフセット)が格納されている。