ファイルヘッダ |
---|
IFD |
: |
画像関連データ (オプション) |
カラーマップ (オプション) |
イメージデータ |
TIFFには各種のバージョンがありますが、ここでは1992年6月に公表されたRevision 6.0(TIFF 6.0)のベースラインTIFFに基づいて説明します。 TIFF 6.0のベースラインTIFFは全ての対応アプリケーションがサポートすべき基本的な機能を定めたもので、この機能を超える機能は拡張TIFFとして扱われます。
TIFFはGIFと同じように複数のブロックから構成されており、各ブロックはタグと呼ばれる識別コードで区別されます。
しかしGIFと違って最初からファイル保存向けに設計されたものであり、基本的にランダム編成になっていて、ファイルヘッダ以外のブロックは原則としてファイルのどこにあってもかまいません。
オフセット | 内容(バイト数) |
---|---|
0 | バイトオーダー(2) "MM"(4D4DH)または"II"(4949H) |
2 | バージョン番号(2) 固定値42 |
4 | IFDポインタ(4) バイト単位のオフセット値 |
TIFFファイルを識別するためのヘッダ部分で、ファイルの先頭に1つだけ存在します。
マルチバイトデータのバイト順を表すASCII文字コードで、「MM(4D4DH)」が上位から下位の正順で保存されるMotorola型を、「II(4949H)」が下位から上位の逆順で保存されるIntel型を表します。
仕様では「バージョン番号」と呼ばれていますが、実際にはバージョンとは無関係に固定値42(2AH)が入っていて、普通はバイトオーダーとともにTIFFファイルの識別子として利用されます。
ちなみに42という値に関して、初期のTIFF仕様書には「深い哲学的な意味がある」などともったいぶって書かれていますが、実はDouglas Adam'sの著書「The Hitchhiker's Guide to The Galaxy」中の『人生、宇宙、そして全てに対する答えは42である』というくだりに由来するという説もあります。 しかし、残念ながら僕はその本を読んだことがないので、真偽のほどは定かではありません。(^^;)
最初のイメージファイルディレクトリ(Image File Directory、IFD)へのポインタで、ファイルの先頭を基点としたバイト単位のオフセット値が保存されています。
TIFFファイルを読み込む場合、ファイルヘッダを読み込んだ後は、普通はこのポインが指す部分にとんで、そこから読み取りを続行します。
オフセット | 内容(バイト数) |
---|---|
0 | エントリカウント(2) 1-65535 |
2 | IFDエントリ0番(12) |
: | : |
IFDポインタ(4) バイト単位のオフセット値 |
イメージファイルディレクトリとは、画像の各種パラメターや、画像関連データ・カラーマップ・イメージデータへのポインタを格納した12バイトのデータエントリの集まりで、ちょうどファイルに対するディレクトリと同じような役目をします。 IFDの各エントリの先頭には、データの型を示すタグと呼ばれる識別コードが保存されていますので、IFDエントリのことを「タグ付きポインタ」と呼ぶこともあります。
ひとつのIFDはひとつのイメージデータに対応し、IFDはファイル中にいくつでも存在できますから、TIFFはGIFのように1つのファイル中に複数のイメージデータを保存することも可能です。 しかし、通常は1つのIFDと1つのイメージデータしかありません。
このIFDに含まれるエントリ数を表します。
ひとつのIFD中に存在できるエントリは最大65535(=64K−1)個です。
オフセット | 内容(バイト数) |
---|---|
0 | タグ(2) データの識別コード |
2 | データの型(2) 1-12 |
4 | カウントフィールド(4) データフィールドに含まれる値の数 |
8 | データフィールドまたはデータポインタ(4) 各種データまたは バイト単位のオフセット値 |
IFDエントリのデータフィールドに含まれるデータ、またはデータポインタが指し示すデータの種類を表す識別コードで、現在のところ00FEH(10進数では254)から0214H(532)を中心とした公開タグと、それ以外の非公開タグとがあります。 非公開タグは特定のアプリケーションが利用するもので、その部分は原則として互換性がなくなります。 このためベースラインTIFFでは公開タグだけを利用し、非公開タグを利用したものは拡張TIFFになります。
IFDエントリは、アプリケーションがデータの種類を素早く確認できるように、タグの小さい順に並べられています。 なおタグは種類が非常に多いので、具体的な解説はデータフィールドの解説と合わせて後で行います。
データの型を表すコードで、以下のような種類があります。
データフィールドに含まれる値の数を表します。 この値にデータの型からわかるデータのバイト数をかけたものが、データフィールドのバイト数になります。 ASCII型のデータの場合、ASCII文字列は1バイト以上のヌル文字(00H)で終了している必要があり、そのヌル文字もカウント数に含まれます。
データ型とカウントフィールドの値から求められるデータフィールドのサイズが4バイト以内ならば、データそのものが含まれ、4バイトよりも大きければ、データフィールドに対するポインタ(ファイルの先頭を基点としたオフセット値)が含まれます。
データポインタは4バイトのLONG型整数によるオフセット値ですので、4バイト全てが有効ですが、データフィールドの場合はデータが左詰めで保存され、必要な上位バイトだけが有効になり、下位バイトには0がパディングされます。
例えばデータがSHORT型の場合は上位2バイトが有効となり、ASCII型で3バイトある場合は上位3バイトが有効となります。
次のIFDへのバイト単位のポインタで、次のIFDがない場合は0が入っています。