読者です 読者をやめる 読者になる 読者になる

プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

GIFフォーマット講座4〜その他、細かい使用について〜

GIFフォーマット(完結)

さて、今回でGIFについては終了します。もう私がGIFとバイナリで関わることはないでしょう。

これまでで重要なことは全て書ききりましたので、あとは、細かいフォーマットについて何ですが、基本的には仕様書を読めば良いだけですし、とほほ様が10年も前にまとめて下さっているので(GIFフォーマットの詳細)、そちらを参照した方が分かりやすいかも。というか、私はGIFアニメーションはすっ飛ばしたのでそちらを読んだ方が確実です。

あ、なんか、もう面倒くさくなってきたw

まぁ、とりあえず、主要なところだけやろうか。



GIFのHeaderとGrobal Color Tableについて

GIF Header

Signature(3B) = "GIF"
Version(3B) = "87a" or "89a"
Logical Screen Width(2B)
Logical Screen Height(2B)
GCTF(1b)CR(3b)SF(1b)SGCT(3b)
Background Color Index(1B)
Pixel Aspect Ratio(1B)

Global Color Table(0〜255×3B)

(表:とほほ様の「GIFフォーマットの詳細」よりそのまま引用)



47 49 46という16進数にはパソコン上でそれぞれG,I,Fという単語が登録されています。(アスキーコード表

次に38 39 61にはそれぞれ8,9,aという文字が割り振られています。
これはGIFのバージョンが1989年に作られたバージョン89aであることを表しています。

次のLogical Screen Widthの2byteはGIF画像の横幅を表します。数値の入り方がちょっと我々の感覚とちがくて、リトルエンディアンと呼ばれる書き方がされています。
リトルエンディアンは1byte目を2byte目に2byte目を1byte目に書き入れます。つまり、64 00ならば、我々が分かりやすくすると 0064となります。つまり、10進数で100となります。

次のLogical Screen Heightは高さになります。Width同様リトルエンディアン方式です

まず、最初の1bitはグローバルカラーテーブルフラグといい、これが1の時はグローバルカラーテーブルが存在します。
グローバルカラーテーブルっていうのはGIFが全体で使える色のパレットみたいな物です。上から順に0,1,2,3.....と色番号が割り振られます。

次の3bitは色解像度といって、1ドットを表すのに必要なビット数から1を引いた物です。
ちょっと意味が分かりにくいと思いますが、たとえば、カラーパレットに色が3色しかなかった時を考えましょう。
1byteでは0~255までの256種類表すことが出来ます。
わざわざ3色を表現するために1byteも使ったらもったいないですよね。
3 色なら2bit ( 0~ 3の4種類) で表すことができるので、1ドットは2bitで表現した方が要領的にお得ということになります。というわけで、この色解像度の値は2-1の 1となり、001という値が入ることになります。上の例では111=7ですので、8bite(=1byte)使うことになります。

なんで1引くの、って?

000 は0ですが、色数が0色の画像ってあり得ませんよね?ということは、1を引く、という行程をしなかったらこの000は全く無駄で使われることのない数字と なります。そんなのもったいないので1引きましょう。ということです。あと、1引かなかったら使える色が126色になってしまいます。

次の0は気にしなくて良いです。なんか、カラーテーブルが重要な色順に並んでいるかどうか、というフラグだそうです。私には意味不明です。基本0でOKです。

最後の111の3bitはグローバルカラーテーブルの色数を表しています。この値をnとすると、グローバルカラーテーブルの色数は

2^(n+1)

になります。基本的には色解像度と同じ値です。

さて、1byteは背景色を指定しています。
この値のグローバルカラーテーブルの色が背景色になります。基本的に0です。

次の00は完全無欠意味不明のピクセルの縦横比です。全く理解が及びません。一体何に使う値なのだろうか。この値をnとし、(n+15)/64 が実際の比率となる。値0はこの比率情報が与えられていないことを意味する、だそうです。

そこから先はカラーテーブルがずらっと、上であった2^(n+1)個並んでいます。
私は上から出てきた順に色を登録しています。


以上がGIFのHeaderとGrobal Color Tableの説明になります




 Graphic Control Extension

     7 6 5 4 3 2 1 0        Field Name                    Type
+---------------+
0 | | Extension Introducer Byte
+---------------+
1 | | Graphic Control Label Byte
+---------------+

+---------------+
0 | | Block Size Byte
+---------------+
1 | | | | | See below
+---------------+
2 | | Delay Time Unsigned
+- -+
3 | |
+---------------+
4 | | Transparent Color Index Byte
+---------------+

+---------------+
0 | | Block Terminator Byte
+---------------+


= Reserved 3 Bits
Disposal Method 3 Bits
User Input Flag 1 Bit
Transparent Color Flag 1 Bit

GIFの仕様書p15より引用)

Extension Introducer
拡張ブロックであることを示す 0x21
Graphic Control Label
このブロックがGraphic Control Extensionであることを示す 0xf9
Block Size
ブロックサイズ。0x04 に固定
Reserved(3bit)
未使用。
Disposal Method(3bit)
表示された後にどう扱うか(0~3,4~は未設定)
  0 特に何もしない(ほぼ100%これ)
  1 配置しない。そのままにしておく
  2 背景色にする。
  3 画像がなかった状態に戻す

正直私自身意味分かってないし、必要ないので0でOKと、気にせずスルー推奨。

User Input Flag(1 Bit)
User Inputが0だったら無し、1だったらありだそうだ。何?って聞かれても私も意味が分からん。
仕様書を解読してくれ
Transparent Color Flag(1 Bit)
透過処理を行う場合は1、行わない場合は0。
Delay Time
表示する際の遅延時間(100分の1秒単位)。
Transparent Color Index
透過処理する色の辞書番号。透過GIFの時は必須。
Block Terminator
ブロック並びの終わりを表わす。0x00



こんなところかな。GIFファイルは基本的には

HeaderとGrobal Color Table


 Graphic Control Extension

画像ブロック

0x3B(GIFファイル終わりのフラグ)

という構成になっています。
GIFアニメとかはもうちょっと拡張ブロックが入るけど、それは各自必要な方は調べておいて下さい。

とほほさんの所に構造なら載っているので、それを見ながらスルーするプログラムを私は作りました。

以上長くなりましたが、これでGIFフォーマット講座を終わります。