GIF[2]。
一体何をしてるんだ?って解説が一切ないので
全くもってわからんちん…だったかと。
てな訳で、解説っちゅーか、
解析してる時の「たぶんこうなんだなメモ」。
- 2pixels x 2pixles の白黒のGIF画像をPhotoshopで用意します(今回は全面黒のGIF画像)
- 「Quick Be」などのバイナリエディタでGIFを開きます
- 「編集」メニューの「全て選択」を選んでから
- 「編集」メニューの「テキスト形式でコピー」の「バイナリ羅列」を選択
- 「秀丸エディタ」等に貼り付けて、半角スペースを改行コードに変換
- こうして縦に並んだ文字列を見てみると、こうなる
ブロック | 実際の値 | 内容 | |
GIF Header | 47 | Signature | G |
49 | I | ||
46 | F | ||
38 | Version | 8 | |
39 | 9 | ||
61 | a | ||
02 | Logical Screen Width | 2pixels | |
00 | |||
02 | Logical Screen Height | 2pixels | |
00 | |||
80 | Packed Fields *1 | ||
00 | Background Color Index | 0 | |
00 | Pixel Aspect Ratio | 0 | |
00 | Global Color Table | カラーパレット0番目 #000000 黒 | |
00 | |||
00 | |||
FF | カラーパレット1番目 #FFFFFF 白 | ||
FF | |||
FF | |||
Graphic Control Extension | 21 | Extension Introducer | 固定 |
F9 | Graphic Control Label | 固定 | |
04 | Block Size | 固定 | |
00 | Packed Fields *2 | ||
00 | Delay Time | 0 | |
00 | |||
00 | Transparent Color Index | 透過処理は行わない | |
00 | Block Terminator | ||
Image Block | 2C | Image Separator | 固定 |
00 | Image Left Position | 0 | |
00 | |||
00 | Image Top Position | 0 | |
00 | |||
02 | Image Width | 2pixels | |
00 | |||
02 | Image Height | 2pixels | |
00 | |||
00 | Packed Fields *3 | ||
02 | LZW Minimum Code Size | 2bits | |
02 | Block Size | 2bytes | |
84 | Image Data | 1000 0100 | |
51 | 0101 0001 | ||
00 | Block Terminator | ||
3B | Trailer |
*1 Global Color Table Flag/Color Resolution/Sort Flag/Size of Global Color Table
*2 Reserved/Disposal Mothod/User Input Flag/Transparent Color Flag
*3 Local Color Table Flag/Interlace Flag/Sort Flag/Reserved/Size of Local Color Table
…で、この中の赤い部分「Image Data」にあたる「84 51」が、ドットの並びについての情報で。
それをどう読み取るか?ってーのが、先日アップしたPDFファイルの表なのでした。
まず「84 51」の場合、「51 84」と逆に並べてから2進数に変換。
0101 0001 1000 0100
で、最初にCC(clear code)を入れないとアカンらしいが、
CCは「1bit/pixel*2*2=4」で、4は2進数で「100」なのかも。(たぶん(^^;;;;;)
0101 0001 1000 0100
このCCを含めた右から12bitsは、CC同様3bitsで1つのデータを表すらしく、
13bits以降は4bitsでを、さらに25bits以降は5bitsで…と
1つのデータを納めるbitが、12bits毎にドンドン1つずつ増えていくそうな。
追記:うーん、この辺りの定義は解釈が非常に怪しいので、今調査中ですー(大汗)
これを踏まえて、次の3bitsを見ると「000」。
これは「Global Color Table」のインデックス0 の色が1つあるって事っぽい。
0101 0001 1000 0100
続いて3bitsを見ると「110」。これは「CC + 2」の数で、LZWの辞書の1つ目の事。
このGIFの場合、インデックス0のドットが2つ並んだ状態が、辞書の1つ目に入っている模様。
0101 0001 1000 0100
次の3bitsを見ると、また「000」。
これも「Global Color Table」のインデックス0 の色が1つあるって事っぽい。
※このタイミングで、インデックス0の色が3つ並んだ状態が、辞書の2つ目(111)に入るだろうが
それは使用しない。何故なら、既にインデックス0の色3つ分(000 と 110)を出てしまっているので、
ここで「111」(インデックス0の色3つ分)を指定してしまうと、全体でインデックス0の色が6つになってしまう為。
0101 0001 1000 0100
で、ここまでで12bits使用しているので、4bits単位で見ると、続くのは「0101」。
これは「CC + 1」の数で、EOI(End of Information)の事。
てな訳で、画像のデータが終わりましたー。
0101 0001 1000 0100
こんな感じで、1つ1つ画像データを見ていった訳ですが、
肝心なLZW圧縮方式については、有難い事に画像圧縮アルゴリズムの「2) LZ78(LZW)法」に書いてくださってるので、それを参照。
ふー。でもまだまだ理解せなアカン事いっぱいだよー。