ヘッダブロック | |
---|---|
論理画面記述ブロック | |
グローバルカラーテーブルブロック オプション | |
拡張ブロック オプション | イメージデータブロック または 特殊用途ブロック |
イメージ記述子 | |
ローカル カラーテーブルブロック オプション | |
イメージデータ | |
トレーラブロック |
GIFには5つの主要構成要素があり、それらが決まった順序で並んでいます。 そして各構成要素は1つまたは複数のブロックから構成されており、各ブロックは先頭バイトにある識別コードあるいはタグで区別されます。 本来、GIFはオンライン転送向けに設計されたものであり、ファイル保存向けに設計されたものではないので、TIFFのようなランダム編成ではなく基本的に順編成になっています。
また特に指定されない限り、マルチバイトの数値領域は最下位バイトから逆順に保存されます。
これはIntelの規約に従ったものです。
オフセット | 内容(バイト数) |
---|---|
0 | GIF識別子(3) 固定値"GIF"(474946H) |
3 | バージョン番号(3) "87a"(383761H)または"89a"(383961H) |
GIFデータストリームを識別するためのブロックで、データストリームの先頭に1つだけ存在します。
GIFデータストリームであることを識別するためのデータで、常にASCII文字の「GIF(474946H)」です。
ASCII文字で表現したGIFのバージョン番号で、先頭の2桁は87から始って昇順に増え、3桁目はaから始ってアルファベット順に増えます。
現在有効なバージョン番号は1987年5月公表の"87a"(383761H)、1989年7月公表の"89a"(383961H)で、"89a"は"87a"の上位バージョンに相当します。
オフセット | 内容(バイト数) |
---|---|
0 | 論理画面の横幅(2) ピクセル単位 |
2 | 論理画面の高さ(2) ピクセル単位 |
4 | 色構造パラメター(1) |
5 | 背景色のカラーインデックス(1) |
6 | ピクセルのアスペクト比(1) |
画像が表示される仮想画面領域を定義するのに必要なデータが含まれるブロックで、ヘッダブロックの直後に1つだけ存在します。 この論理画面記述ブロックとヘッダブロックを合わせて、「ヘッダ」として扱う場合もあります。
画像を表示するための仮想的な論理画面の幅と高さを、ピクセル単位で表した値です。
画像は論理画面上に表示されますので、論理画面の幅と高さが、実際の画像の幅と高さと同じ値になるとは限りません。
ビット | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Global Color Table Flag (1) | Color Resolusion (3) | Sort Flag (1) | Size of Global Color Table (3) |
色構造に関するデータをビット単位でバイトにパックした領域で、左図のような構造をしています。
グローバルカラーテーブルの有無を示すビットで、ビットが1の場合には論理画面記述子のすぐ後にグローバルカラーテーブルが存在し、0の場合にはグローバルカラーテーブルは存在しません。
元の画像に使われたカラーテーブルの、各原色の階調数を計算するためのデータで、原色1つあたりのビット数から1を引いた値です。 例えばこの値が7の場合、
となります。
このデータはGlobal Color Table Flagが1の時しか意味を持たず、領域が3ビットしかありませんので、0(=2階調)から7(=256階調)までの値しか表すことができません。
グローバルカラーテーブルがソートされているがどうかを表すビットで、ビットが1の場合はグローバルカラーテーブルは使用頻度の高い色順にソートされており、0の場合は特にソートされていません。 このデータもGlobal Color Table Flagが1の時しか意味を持ちません。
グローバルカラーテーブルのエントリ数を計算するためのデータで、この値に1を足した値で2をべき乗するとグローバルカラーテーブルのエントリ数になります。 例えばこの値が7の場合、
となります。
このデータはGlobal Color Table Flagが1の時しか意味を持たず、領域が3ビットしかありませんので、0(=2色)から7(=256色)までの値しか表すことができません。
論理画面の背景色として使用する色の、グローバルカラーテーブルにおけるインデックス番号を表す値です。 実際の画像が論理画面より小さい場合、画像以外の画面領域はこの背景色で表示されます。
元の画像を表示していたピクセルの縦横比を計算するためのデータで、ピクセルの高さに対する横幅の比を表す値です。 元のピクセルの縦横比は次の式で計算されます。
この値が0の場合、元のピクセルの縦横比を計算するための情報はありません。
オフセット | 内容(バイト数) |
---|---|
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ファイル中に複数のイメージデータが含まれていて、イメージデータごとに異なったカラーテーブルを使用する場合に存在します。
バージョン89aで追加された拡張ブロックで、現在のところグラフィック制御拡張ブロック、コメント拡張ブロック、プレーンテキスト拡張ブロック、アプリケーション拡張ブロックの4種類があります。 これらの拡張ブロックは必要な場合にだけ存在するオプションブロックで、1つのGIFファイル中に複数個存在することができ、種類によってはイメージデータブロックの後に置かれることもあります。
オフセット | 内容(バイト数) |
---|---|
0 | 拡張ブロック開始識別子(1) 固定値21H |
1 | グラフィック制御拡張識別子(1) 固定値F9H |
2 | ブロックのバイト数(1) 固定値4 |
3 | 表示処理パラメター(1) |
4 | 待機時間(2) 100分の1秒単位 |
6 | 透明色のカラーインデックス(1) |
7 | ブロック終了識別子(1) 固定値0 |
イメージデータを表示する時、特殊な処理(例えば特定の色の透過色扱い等)を行う場合に必要なデータが含まれています。 原則としてこれらのデータは直後に続くイメージデータにだけ影響を及ぼしますので、イメージデータが複数ある場合にはこのブロックが複数個存在することもあります。
拡張ブロックの開始を表す識別子で、常に固定値21H(10進数では33)です。 この識別子は全ての拡張ブロックで共通です。
この拡張ブロックがグラフィック制御拡張ブロックであることを表す識別子で、常に固定値F9H(10進数では249)です。
直後に続くブロックのバイト数で、常に固定値4です。
GIFファイルで使用する「ブロックサイズ」には、ブロックの開始を示すBlock Sizeと、終了を示すBlock Terminatorのバイト数は含まれません。
ビット | |||||||
---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
予約済み (3) | Disposal Method (3) | User Input Flag (1) | Transparent Color Flag (1) |
表示処理に関するデータをビット単位でバイトにパックした領域で、左図のような構造をしています。
将来の拡張用予約領域で、通常は3ビットとも0になっています。
画像を表示し終わった後、どのような処理をするかを表すデータで、次のような種類があります。
処理を継続する前にユーザーの入力を必要とするかどうかを表すデータで、次のような種類があります。
ユーザー入力の種類はアプリケーションによって決められ、普通はマウスボタンのクリック、リターンキーの押下などが用いられます。
透明色のカラーインデックスTransparent Color Indexが指定されているかどうかを表すビットで、0ならば指定なし、1ならば指定されていることを表します。
画像表示後、次の処理を続行するまでの待機時間を表すデータで、100分の1秒単位の値です。 この値が0の場合はすぐに処理を続行します。 この待機時間が指定されているのと同時に、ユーザー入力フラッグUser Input Flagもセットされていますと、待機時間が過ぎていなくてもユーザー入力があればすぐに処理が続行されます。
透明色扱いする色のカラーテーブルのインデックス番号を表す値で、Transparent Color Flagがセットされている時だけ意味を持ちます。 画像中の透明色に指定された色で塗られた領域は、以前に表示されていたものがそのまま表示され続けますので、その部分だけ透明になって、背景が透けて見える感じになります。
グラフィック拡張ブロックの終了を表す識別子で、常に固定値0です。