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 |