Exifフォーマット


Exifでは、画像データの形式として次の画像フォーマットをサポートしている:

RGB非圧縮データ :Baseline TIFF Rev.6.0 RGB Full Color Images
YCbCr非圧縮データ :TIFF Rev.6.0 Extensions YCbCr
JPEG圧縮データ :JPEG Baseline ADCT

ここでは、最も多く使われている圧縮データの基本構造についてメモする。


圧縮データファイルの構造   APP1の構造
SOI 圧縮データスタート   APP1 Marker
APP1

アプリケーション・マーカセグメント1

(Exif付属情報用)

⇒⇒⇒ APP1 Length
Exif識別コード
(APP2)

(アプリケーション・マーカセグメント2)

(Flashpix拡張データ用)

  TIFF Header
  0th IFD
DQT

量子化テーブル

  0th IFD Value
DHT ハフマンテーブル   1st IFD
(DRI) (リスタートインターバル)   1st IFD Value
SOF フレームヘッダ   1st IFD画像データ
SOS スキャンヘッダ  
  圧縮データ  
EOI 圧縮データ終了    
圧縮データファイルの基本構造

Exif圧縮ファイル   APP1マーカ    
SOI   APP1 Marker    
APP1

⇒⇒⇒

Length   圧縮サムネイル
DQT   Exif   SOI
DHT   TIFF Header   DQT
SOF   0th IFD   DHT
SOS   1st IFD   SOF
Compressed Data   JPEGInterchangeFormat   SOS
  JPEGInterchangeFormatLength   Compressed Data
  JPEG Thumbnail ⇒⇒⇒
EOI     EOI
圧縮サムネイルを持つExifファイルの構造

上図のSOI (Start Of Image)は0xFFD8で、EOI (End Of Image)は0xFFD9である。これらもマーカの1つであるが、付属データを伴わないという意味で特別なマーカである。

一般に、マーカは次の形式をとる。

0xFFxx SSSS DDD......DDDD
SSSS: UInt16であらわされたデータサイズ(バイト数)、SSSSの2バイトを含む
DDD......DDDD: SSSSバイトのバイト列で表されたデータ

データサイズは、所謂モトローラ形式(大きい桁から順に並ぶ形式)で格納されている。例えば、

  FF C1 00 0C

というマーカが見つかったら、これは0xFFC1というマーカの後に0x000C=12バイトのデータが続くという意味になるが、0x000Cという2バイトもデータの一部として数えるため、0x000Cの後には10バイトのデータが続く。


参考までにJPEGファイルで通常使われるマーカを下記一覧に示す。

マーカ 名前 記述
FFD8 SOI Start of Imageファイルの先頭
FFE0 APP0 2種類ある解像度情報など(ローダでは無視でき、JFIFで使用)
FFE0(2)、マーカSIZE(2)、"JFIF"(4)、00(1)、Format Version 0101(2)、単位00(1)、水平解像度0001(2)、垂直解像度0001(2)、サムネイル画像横サイズ00(1)、サムネイル画像縦サイズ00(1)
FFDB DQT 量子化テーブル定義
FFDB(2)、Lq(2)テーブルサイズ、{ Pq(4bit)量子化テーブル精度(0:8bit 1:16bit 通常:0)、Tq(4bit)量子化テーブル番号(1-4 0-3?)、データ64個 }
複数のテーブルを1つのマーカで書くことも、複数のマーカに別けて書くこともできる。
FFC4 DHT DCTで算出された値のエンコード用に作られたハフマンテーブルの情報
Lhハフマンテーブル長、{ Thハフマンテーブル識別子、(上位4bit 0:DC成分 1:AC成分、下位4bit 識別番号0~3)、Li(8bit)長さiのハフマン符号数(1≦i≦16)、Vij(8bit) }
通常は、JPEG仕様に載っているものがそのまま使われる。
FFC0 SOF0 標準DCT圧縮
Lf(2)、P(1)サンプル精度、Y(2)垂直サイズ、X(2)水平サイズ、Nif(1)サンプリング数03 (YCrCbの3つ)、{ フレーム成分指定パラメータ Nifの数繰り返し 成分識別子(1)、水平(0.5)/垂直(0.5)サンプリングファクタ 各1~4、量子化テーブルセレクタ(1) }
例 FF C0 00 11 08 01 00 01 00 03
01,22,00 (JFIFでは輝度)
02,11,01
03,11,01
FFC1 SOF1 プログレッシブDCT圧縮
FFDD DRI イメージのリスタート間隔を定義する
FFDA SOS Start of Scan; エンコードされたイメージデータ
Ls SOSのヘッダ長6+2*Ns
Ns数(1~4)、{ Csi、flag 10:Tdi DC 1:Tai AC用ハフマンテーブルセレクタ }*n、Ss、Se、Ah、Al
FFD9 EOI End of Image ファイルの終端
FFE0

FFED
APPx アプリ
FFEx APPxマーカ(2)、XXXX サイズ(2)、XXXX データ(可変長)
APP0は、JFIFフォーマットで特別に使われる。
内部にFFXXのデータを各種含むことがある。
FF00   SOS中での?データ0xFF