玄関コンピュータの部屋各種解説コーナーCGファイル概説

(vi) StripOffsets

TIFFのビットマップイメージデータは処理しやすい程度の大きさのいくつかのストリップ(脱衣ショー……ではなく断片 (^^;))に分割されて、普通はIFDの後に保存されます。 以前のバージョンでは単一のブロックに保存されていたこともありましたが、現在は処理時のバッファ効率の関係から、いくつかのストリップに分割することが推奨されています。

ちなみにFM-TOWNSのTIFFフォーマットは古いバージョンに準拠していて、単一のブロックに保存されますが、IBMのTIFFフォーマットはいくつかのストリップに分割して保存されます。(ただし、IBMのTIFFではIFDがファイルの最後に保存されます。(~.~))

↓データフィールド/ビットマップイメージデータ↓
オフセット内容(バイト数)
0タグ(2)
固定値0111H(273)
2データの型(2)
SHORTまたはLONG
4カウントフィールド(4)
ストリップの個数
8データフィールドまたはデータポインタ(4)
ビットマップイメージデータへのポインタ
またはデータフィールドへのポインタ
オフセットテーブル
オフセット内容(バイト数)
0ストリップ1のオフセット(2または4)
::
2/4×(N-1):ストリップNのオフセット(2または4)
 
 
ビットマップイメージデータ
オフセット内容(バイト数)
0ビットマップストリップ1(任意)
::
:ビットマップストリップN(任意)

ストリップの大きさは、仕様書では(圧縮前のサイズで)8Kバイト程度にすべきだとされていますが、実際には8〜64K程度にすることが多いようです。 ストリップごとのイメージデータの行数は、

int(ストリップの最大サイズ(8〜64KB)/ImageWidth(行のバイト数))

で決められ、この値はRowsPerStrip(必須タグ、後述)に保存されます。 int()は切り捨てによる整数化関数で、この整数化の結果が0となった場合、RowsPerStripは1となります。

ストリップの個数は、

int({ImageLength + RowsPerStrip − 1}/RowsPerStrip)

となり、この値はカウントフィールドに保存されます。

ストリップが1個しかない場合、IFDエントリの最後のフィールドにはそのストリップへのポインタが保存されます。 ストリップが2個以上ある場合にはストリップへのポインタも2個以上必要ですから、最後のフィールドには納まりきらず、ストリップのオフセットテーブルとして別の場所(普通はIFDの後、ストリップの前)に格納され、そのストリップオフセットテーブルに対するポインタが最後のフィールドに保存されます。 つまりこの場合、ビットマップイメージデータはストリップオフセットテーブルを通して間接的にアクセスされることになります。

ストリップオフセットテーブルは連続していなければなりませんが、各ストリップは各々独立であり、連続して保存される必要はありません(通常は連続して保存されます)。 またビットマップイメージデータが圧縮されて保存される場合も、ストリップごとに独立に圧縮されます。 ストリップオフセットテーブルのデータ型はSHORTまたはLONGですが、初期のバージョンではLONGのみとなっていたため、互換性を保つためにLONG型を使用することが推奨されています。

このタグは省略することができず、デフォールト値はありません。

(vii) RowsPerStrip

オフセット内容(バイト数)
0タグ(2)
固定値0116H(278)
2データの型(2)
SHORTまたはLONG
4カウントフィールド(4)
8データフィールド(4)
各ストリップの行数

ストリップごとのイメージデータの行数で、

int(ストリップの最大サイズ(8〜64KB)/ImageWidth(行のバイト数))

で決められる値です。 この値のデータ型はSHORTまたはLONGですが、初期のバージョンではLONGのみとなっていたため、互換性を保つためにLONG型を使用することが推奨されています。

このタグが省略された場合のデフォールト値はSHORT型の最大値、つまり(232−1)です。

(viii) StripByteCounts

オフセット内容(バイト数)
0タグ(2)
固定値0117H(279)
2データの型(2)
SHORTまたはLONG
4カウントフィールド(4)
ストリップの個数
8データフィールドまたはデータポインタ(4)
ビットイメージマップデータのバイト数
またはデータフィールドへのポインタ
            ↓
ストリップ長テーブル
オフセット内容(バイト数)
0ストリップ1のバイト数(2または4)
::
:ストリップNのバイト数(2または4)

ストリップごとのバイト数で、データが圧縮されている場合には圧縮後のバイト数を表します。 ストリップの個数は、StripOffsetsと同様に、

int({ImageLength + RowsPerStrip − 1}/RowsPerStrip)

となり、この値はカウントフィールドに保存されます。

ストリップの個数が1つしかない場合、IFDエントリの最後のフィールドはデータフィールドとなり、ビットマップイメージデータのバイト数そのものが保存されます。

ストリップが2個以上ある場合にはストリップ長も2個以上必要ですから、最後のフィールドには納まりきらず、ストリップ長テーブルとして別の場所(普通はIFDの後、ストリップの前)に格納され、そのストリップ長テーブルに対するポインタが最後のフィールドに保存されます。 その場合、各ストリップは各々独立であり、連続して保存される必要はありませんので、ストリップオフセットテーブルとストリップ長テーブルの両者を利用しなければ、ストリップを正しく処理することはできません。 またストリップオフセットテーブルと同様、ストリップ長テーブルも連続していなければなりません。

ストリップ長テーブルのデータ型はSHORTまたはLONGですが、初期のバージョンではLONGのみとなっていたため、互換性を保つためにLONG型を使用することが推奨されています。

このタグは省略することができず、デフォールト値はありません。

(ix) XResolusion

オフセット内容(バイト数)
0タグ(2)
固定値011AH(282)
2データの型(2)
RATIONAL
4カウントフィールド(4)
8データポインタ(4)
データフィールドへのポインタ
          ↓
水平方向の解像度(ピクセル/測定単位)
オフセット内容(バイト数)
0分子(ピクセル数)(4)
4分母(測定単位)(4)

画像の水平方向の解像度をピクセル/測定単位で表したものです。 測定単位はResolutionUnit(必須タグ、後述)で表される単位であり、この値をImageWidth倍することによって、オリジナル画面に表示されていた時のオリジナル画像の実際の幅がわかります。 データ型がRATIONALのためデータフィールドとして8バイト必要ですから、最後のフィールドには納まりきらず、別の場所(IFDの後)に格納して、そのデータフィールドに対するポインタが最後のフィールドに入ります。

このタグは省略することができず、デフォールト値はありませんが、実際には利用されることは少ないようです。

(x) YResolusion

オフセット内容(バイト数)
0タグ(2)
固定値011BH(283)
2データの型(2)
RATIONAL
4カウントフィールド(4)
8データポインタ(4)
データフィールドへのポインタ
          ↓
垂直方向の解像度(ピクセル/測定単位)
オフセット内容(バイト数)
0分子(ピクセル数)(4)
4分母(測定単位)(4)

画像の垂直方向の解像度をピクセル/測定単位で表したものです。 XResolusionと同様、測定単位はResolutionUnitで表される単位であり、この値をimagelength倍することによって、オリジナル画面に表示されていた時のオリジナル画像の実際の高さがわかります。 データ型がRATIONALのためデータフィールドとして8バイト必要ですから、最後のフィールドには納まりきらず、別の場所(IFDの後)に格納して、そのデータフィールドに対するポインタが最後のフィールドに入ります。

このタグは省略することができず、デフォールト値はありませんが、実際には利用されることは少ないようです。

(xi) ResolutionUnit

オフセット内容(バイト数)
0タグ(2)
固定値0128H(296)
2データの型(2)
SHORT
4カウントフィールド(4)
8データフィールド(4)
整数コード1-3

画像の解像度の測定単位で表したもので、以下のような種類があります。

このタグが省略された場合のデフォールト値は2(inch単位)です。

(xii) ColorMap

オフセット内容(バイト数)
0タグ(2)
固定値0140H(320)
2データの型(2)
SHORT
4カウントフィールド(4)
3×2BitsPerSample
8データポインタ(4)
データフィールドへのポインタ
            ↓
カラーマップテーブル
オフセット内容(バイト数)
0カラーマップエントリ0番の赤の値(2)
1-65535
::
2×(N-1)カラーマップエントリ(N-1)番の赤の値(2)
1-65535
2×Nカラーマップエントリ0番の緑の値(2)
1-65535
::
4×(N-1)カラーマップエントリ(N-1)番の緑の値(2)
1-65535
4×Nカラーマップエントリ0番の青の値(2)
1-65535
::
6×(N-1)カラーマップエントリ(N-1)番の青の値(2)
1-65535

カラーマップモデルの場合だけ存在するカラーマップテーブルで、最後のデータポインタはそのテーブルに対するオフセット値です。 カラーマップテーブルが存在しない場合、データポインタは0となります。 カラーマップテーブルはRGBごとに連続した3つのブロックで構成されていて、それぞれN=2BitsPerSample個のエントリがあります。 したがってテーブル全体のデータ数は3×2BitsPerSample個となり、この値がカウントフィールドの値となります。

RGBの値は、それぞれの最大輝度が65535(=216−1)になるように正規化されています。 ただし現在のディスプレイのカラーマップは最大でも8ビットなので、16ビットあっても実際の輝度は256階調しかありません。

このタグは省略することができず、デフォールト値はありません。