さて、今回で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(GIFの仕様書p15より引用)
+---------------+
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
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フォーマット講座を終わります。