frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

GIF[2]。

先日の「GIF」

一体何をしてるんだ?って解説が一切ないので

全くもってわからんちん…だったかと。

てな訳で、解説っちゅーか、

解析してる時の「たぶんこうなんだなメモ」。

  1. 2pixels x 2pixles の白黒のGIF画像をPhotoshopで用意します(今回は全面黒のGIF画像)
  2. Quick Be」などのバイナリエディタGIFを開きます
  3. 「編集」メニューの「全て選択」を選んでから
  4. 「編集」メニューの「テキスト形式でコピー」の「バイナリ羅列」を選択
  5. 秀丸エディタ」等に貼り付けて、半角スペースを改行コードに変換
  6. こうして縦に並んだ文字列を見てみると、こうなる

ブロック実際の値内容
GIF Header47SignatureG
49I
46F
38Version8
399
61a
02Logical Screen Width2pixels
00
02Logical Screen Height2pixels
00
80Packed Fields *1 
00Background Color Index0
00Pixel Aspect Ratio0
00Global Color Tableカラーパレット0番目
#000000
00
00
FFカラーパレット1番目
#FFFFFF
FF
FF
Graphic Control Extension21Extension Introducer固定
F9Graphic Control Label固定
04Block Size固定
00Packed Fields *2
00Delay Time0
00
00Transparent Color Index透過処理は行わない
00Block Terminator
Image Block2CImage Separator固定
00Image Left Position0
00
00Image Top Position0
00
02Image Width2pixels
00
02Image Height2pixels
00
00Packed Fields *3
02LZW Minimum Code Size2bits
02Block Size2bytes
84Image Data1000 0100
510101 0001
00Block Terminator
3BTrailer

*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)法」に書いてくださってるので、それを参照。

ふー。でもまだまだ理解せなアカン事いっぱいだよー。