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

4.2 仕様

ヘッダブロック
論理画面記述ブロック
グローバルカラーテーブルブロック
オプション
拡張ブロック
オプション
イメージデータブロック
または
特殊用途ブロック
イメージ記述子
ローカル
カラーテーブルブロック

オプション
イメージデータ
トレーラブロック

GIFには5つの主要構成要素があり、それらが決まった順序で並んでいます。 そして各構成要素は1つまたは複数のブロックから構成されており、各ブロックは先頭バイトにある識別コードあるいはタグで区別されます。 本来、GIFはオンライン転送向けに設計されたものであり、ファイル保存向けに設計されたものではないので、TIFFのようなランダム編成ではなく基本的に順編成になっています。

また特に指定されない限り、マルチバイトの数値領域は最下位バイトから逆順に保存されます。 これはIntelの規約に従ったものです。

(1) ヘッダブロック

オフセット内容(バイト数)
0GIF識別子(3)
固定値"GIF"(474946H)
3バージョン番号(3)
"87a"(383761H)または"89a"(383961H)

GIFデータストリームを識別するためのブロックで、データストリームの先頭に1つだけ存在します。

1) GIF識別子(Signature)

GIFデータストリームであることを識別するためのデータで、常にASCII文字の「GIF(474946H)」です。

2) バージョン番号(Version)

ASCII文字で表現したGIFのバージョン番号で、先頭の2桁は87から始って昇順に増え、3桁目はaから始ってアルファベット順に増えます。 現在有効なバージョン番号は1987年5月公表の"87a"(383761H)、1989年7月公表の"89a"(383961H)で、"89a"は"87a"の上位バージョンに相当します。

(2) 論理画面記述ブロック(論理画面記述子)

オフセット内容(バイト数)
0論理画面の横幅(2)
ピクセル単位
2論理画面の高さ(2)
ピクセル単位
4色構造パラメター(1)
5背景色のカラーインデックス(1)
6ピクセルのアスペクト比(1)

画像が表示される仮想画面領域を定義するのに必要なデータが含まれるブロックで、ヘッダブロックの直後に1つだけ存在します。 この論理画面記述ブロックとヘッダブロックを合わせて、「ヘッダ」として扱う場合もあります。

1) 論理画面の横幅と高さ(Logical Screen Width、Logical Screen Height)

画像を表示するための仮想的な論理画面の幅と高さを、ピクセル単位で表した値です。 画像は論理画面上に表示されますので、論理画面の幅と高さが、実際の画像の幅と高さと同じ値になるとは限りません。

2) 色構造パラメーター(Packed Fields)

ビット
76543210
Global
Color
Table
Flag
(1)
Color
Resolusion
(3)
Sort
Flag
(1)
Size of
Global
Color
Table
(3)

色構造に関するデータをビット単位でバイトにパックした領域で、左図のような構造をしています。

(i) Global Color Table Flag

グローバルカラーテーブルの有無を示すビットで、ビットが1の場合には論理画面記述子のすぐ後にグローバルカラーテーブルが存在し、0の場合にはグローバルカラーテーブルは存在しません。

(ii) Color Resolusion

元の画像に使われたカラーテーブルの、各原色の階調数を計算するためのデータで、原色1つあたりのビット数から1を引いた値です。 例えばこの値が7の場合、

各原色の階調数=2(7+1)=28=256

となります。

このデータはGlobal Color Table Flagが1の時しか意味を持たず、領域が3ビットしかありませんので、0(=2階調)から7(=256階調)までの値しか表すことができません。

(iii) Sort Flag

グローバルカラーテーブルがソートされているがどうかを表すビットで、ビットが1の場合はグローバルカラーテーブルは使用頻度の高い色順にソートされており、0の場合は特にソートされていません。 このデータもGlobal Color Table Flagが1の時しか意味を持ちません。

(iv) Size of Global Color Table

グローバルカラーテーブルのエントリ数を計算するためのデータで、この値に1を足した値で2をべき乗するとグローバルカラーテーブルのエントリ数になります。 例えばこの値が7の場合、

グローバルカラーテーブルのエントリ数=2(7+1)=28=256

となります。

このデータはGlobal Color Table Flagが1の時しか意味を持たず、領域が3ビットしかありませんので、0(=2色)から7(=256色)までの値しか表すことができません。

3) 背景色のカラーインデックス(Background Color Index)

論理画面の背景色として使用する色の、グローバルカラーテーブルにおけるインデックス番号を表す値です。 実際の画像が論理画面より小さい場合、画像以外の画面領域はこの背景色で表示されます。

4) ピクセルのアスペクト比(Pixel Aspect Ratio)

元の画像を表示していたピクセルの縦横比を計算するためのデータで、ピクセルの高さに対する横幅の比を表す値です。 元のピクセルの縦横比は次の式で計算されます。

縦横比=(Pixel Aspect Ratio + 15)/64

この値が0の場合、元のピクセルの縦横比を計算するための情報はありません。

(3) グローバルカラーテーブルブロック

オフセット内容(バイト数)
0カラーテーブルエントリ0番の赤の値(1)
0-255
1カラーテーブルエントリ0番の緑の値(1)
0-255
2カラーテーブルエントリ0番の青の値(1)
0-255
::

カラーマップの内容を保存したブロックで、論理画面記述子中のGlobal Color Table Flagが1の時だけ、論理画面記述子の直後に1つだけ存在します。 カラーテーブルエントリ数Nは2(Size of Global Color Table + 1)であり、ブロック全体のバイト数は3×Nとなります。

グローバルカラーテーブルはローカルカラーテーブルを持っていないイメージデータが使用します。 ローカルカラーテーブルは、1つのGIFファイル中に複数のイメージデータが含まれていて、イメージデータごとに異なったカラーテーブルを使用する場合に存在します。

(4) 特殊用途ブロック

バージョン89aで追加された拡張ブロックで、現在のところグラフィック制御拡張ブロック、コメント拡張ブロック、プレーンテキスト拡張ブロック、アプリケーション拡張ブロックの4種類があります。 これらの拡張ブロックは必要な場合にだけ存在するオプションブロックで、1つのGIFファイル中に複数個存在することができ、種類によってはイメージデータブロックの後に置かれることもあります。

1) グラフィック制御拡張ブロック

オフセット内容(バイト数)
0拡張ブロック開始識別子(1)
固定値21H
1グラフィック制御拡張識別子(1)
固定値F9H
2ブロックのバイト数(1)
固定値4
3表示処理パラメター(1)
4待機時間(2)
100分の1秒単位
6透明色のカラーインデックス(1)
7ブロック終了識別子(1)
固定値0

イメージデータを表示する時、特殊な処理(例えば特定の色の透過色扱い等)を行う場合に必要なデータが含まれています。 原則としてこれらのデータは直後に続くイメージデータにだけ影響を及ぼしますので、イメージデータが複数ある場合にはこのブロックが複数個存在することもあります。

(i) 拡張ブロック開始識別子(Extension Introducer)

拡張ブロックの開始を表す識別子で、常に固定値21H(10進数では33)です。 この識別子は全ての拡張ブロックで共通です。

(ii) グラフィック制御拡張識別子(Graphic Control Label)

この拡張ブロックがグラフィック制御拡張ブロックであることを表す識別子で、常に固定値F9H(10進数では249)です。

(iii) ブロックのバイト数(Block Size)

直後に続くブロックのバイト数で、常に固定値4です。 GIFファイルで使用する「ブロックサイズ」には、ブロックの開始を示すBlock Sizeと、終了を示すBlock Terminatorのバイト数は含まれません。

(iv) 表示処理パラメター(Packed Fields)

ビット
76543210
予約済み
(3)
Disposal
Method
(3)
User
Input
Flag
(1)
Transparent
Color
Flag
(1)

表示処理に関するデータをビット単位でバイトにパックした領域で、左図のような構造をしています。

i) 予約済み

将来の拡張用予約領域で、通常は3ビットとも0になっています。

ii) Disposal Method

画像を表示し終わった後、どのような処理をするかを表すデータで、次のような種類があります。

iii) User Input Flag

処理を継続する前にユーザーの入力を必要とするかどうかを表すデータで、次のような種類があります。

ユーザー入力の種類はアプリケーションによって決められ、普通はマウスボタンのクリック、リターンキーの押下などが用いられます。

iv) Transparent Color Flag

透明色のカラーインデックスTransparent Color Indexが指定されているかどうかを表すビットで、0ならば指定なし、1ならば指定されていることを表します。

(v) 待機時間(Delay Time)

画像表示後、次の処理を続行するまでの待機時間を表すデータで、100分の1秒単位の値です。 この値が0の場合はすぐに処理を続行します。 この待機時間が指定されているのと同時に、ユーザー入力フラッグUser Input Flagもセットされていますと、待機時間が過ぎていなくてもユーザー入力があればすぐに処理が続行されます。

(vi) 透明色のカラーインデックス(Transparent Color Index)

透明色扱いする色のカラーテーブルのインデックス番号を表す値で、Transparent Color Flagがセットされている時だけ意味を持ちます。 画像中の透明色に指定された色で塗られた領域は、以前に表示されていたものがそのまま表示され続けますので、その部分だけ透明になって、背景が透けて見える感じになります。

(vii) ブロック終了識別子(Block Terminator)

グラフィック拡張ブロックの終了を表す識別子で、常に固定値0です。