C言語で簡単にグラフを描くライブラリ CGIF GIFのファイル構造
GIFのファイル構造
- GIF Header
- 最初に'G''I''F''8''9''a'と入っています。
- GIFファイルの横幅と高さの順に、それぞれ2バイトずつ入っています。
- 0x1234なら、0x34,0x12の順に格納されています。
- 1バイト分省略
- グローバルカラーテーブルにおける背景色のインデックスが入っています。
- 1バイト省略
- グローバルカラーテーブルが最後に続きます。
私の作成したプログラムでは256色扱うので、256×3バイトあります。
(×3は、光の三原色で、R,G,Bそれぞれ1バイト使う為)
私の作成したプログラムでは、
- 最初に基本16色を格納します。(16×3バイト)
- 次に未使用部分が、24×3バイトあります。
- 最後に216色(216×3バイト)を
0x 00 00 00 -> 0x 00 00 33 -> 0x 00 00 66 -> ・・・ -> 0x 00 00 ff ->
0x 00 33 00 -> 0x 00 33 33 -> 0x 00 33 66 -> ・・・ -> 0x 00 33 ff ->
0x ff ff 00 -> ・・・ -> 0x ff ff 99 -> 0x ff ff cc -> 0x ff ff ff
と格納します。
(色の指定を0x******で行ったときは、上の216色の中で最も近い色に近似します。)
- アプリケーション拡張ブロック
cgifNumberOfIterationsが1の場合(動画にしない場合)はこのブロックは飛ばします。
- 最初は0x21,0x0bで、アプリケーション拡張ブロックであることを示す固定値です。
- 次に、'N''E''T''S''C''A''P''E''2''.''0'と入っています。
- 2バイト省略
- 2バイト分使って、動画を繰り返す回数を指定します。
- cgifNumberOfIterations = 0;で無限回繰り返します。
- 最後はブロックの並びの終わりを表す0x00で終了します。
- 以下、グラフィック拡張ブロックとイメージブロックをセットで、アニメーションの数(frame数)だけ作成します。
- グラフィック拡張ブロック
- 最初は0x21,0xf9で、グラフィック拡張ブロックであることを示す固定値です。
- 1バイト省略
- 次に表示処理パラメータ(PackedFields)が1バイト来ます。
1バイトを3ビット、3ビット、1ビット、1ビットに分けます。
- 最下位の1ビットは、透過処理するかどうかを指定します。
- 次の1ビットは、処理を継続する前にユーザー入力を必要とするかを指定します。
(このあたりの機能を私は試したことがありません。)
- 次の3ビットは画像表示後の処理を指定します。
- 0 : 指定なし。
- 1 : 画像を残す。
- 2 : 背景色を回復。
- 3 : 以前のものを回復。
- 最上位の3ビットは、予約済みで000で固定です。
- 次は2バイトを使って次のイメージを表示するまでの待機時間(1/100秒)を指定します。
- 透明色のカラーインデックスが来ます。
(詳しくは、色の指定を御覧になってください。)
- 最後にブロックの終了識別子0x00が来ます。
- イメージブロック
- まず、イメージブロックであることを示す0x2cが来ます。
- GIF画像全体に対するこのイメージの左端相対位置、右端相対位置の順にそれそれ2バイトずつ記述します。
- このイメージブロックの横幅、縦幅を順に2バイトずつ記述します。
- 1バイト省略
- このプログラムでは、ローカルカラーテーブルは使用しないので、
次は、256色なら0x08が来ます。(Lzw Minimum Code Size)
- 最後にイメージデータのバイト数とLZW圧縮されたイメージデータを格納します。
- LZW圧縮については、こちらを読んでください。
- イメージデータが256バイトを超えてしまった場合やLZW辞書がいっぱいになってしまった場合は、少しややこしいです。
私のプログラムでは、LZW辞書がDICT_MAXに達してしまったとき、
まず、最後のsuffixまで出力して、もう一度、イメージデータのバイト数、イメージデータ(クリアコード+prefix達+suffix)を繰り返し、最後に終了コードを入れます。
- 最後にブロックの並びの終わりを表す0x00を入れます。
- 最後にGIFデータストリームの終わりを表す0x3bを入れて終了です。
TOP
LZW圧縮について
戻る