GIFファイルのフォーマット解析面白い!

GIFファイルのフォーマット解析面白い!

まだLZWアルゴリズムはよく調べてませんけど、
HSPで、ヘッダ、イメージブロック (LZWの所は抜き出しだけとりあえずした) 、コメントブロックはそれぞれいろいろ抜き出せました。
あとはグラフィック制御ブロックとアプリケーションブロックとLZWアルゴリズムさえわかればできます。
最終的にはこれを、GIFアニメーション入出力モジュールにしたいと思っています。
しかし、毎度のことのように、大変になったら途中でやめるかもしれません…。ご了承ください。
6つのサイトと、バイナリエディタと、画像ファイル解析ツール使って勉強している最中ですので、もうちょっと時間がかかるのはご了承ください。
参考にしているサイト
使っているソフト
作りかけのソース (※実行しないでください。バグります)

// メモ
// 同じ変数を使用している場合、それは同じで大丈夫なのか確認すること。
//最初
file_name="ファイル名"
// 読み込み
exist file_name
file_size=strsize
if strsize=-1 : end
sdim file_data,file_size
bload file_name,file_data
// ヘッダ解析
part_data=""
part_data2=0
part_size=3
index=0
memexpand part_data,part_size
memcpy part_data,file_data,part_size,0,index
if (part_data+"")!"GIF" : end
index+part_size
part_size=3
memexpand part_data,part_size
memcpy part_data,file_data,part_size,0,index
switch (part_data+"")
case "87a"
gif_version=0
swbreak
case "89a"
gif_version=1
swbreak
default
gif_version=-1
swbreak
swend
if gif_version!1 : end
index+part_size
gif_width=wpeek(file_data,index) : index+2
gif_height=wpeek(file_data,index) : index+2
part_data2=peek(file_data,index) : index+1
gif_gctf=part_data2/128
gif_cr=(part_data2\128)/16
gif_sf=(part_data2\16)/8
gif_sgct=part_data2\8
gif_bci=peek(file_data,index) : index+1
gif_par=peek(file_data,index) : index+1
if gif_gctf=1 {
part_size=3
repeat gif_sgct+1
part_size*2
loop
gif_gct=""
memexpand gif_gct,part_size
memcpy gif_gct,file_data,part_size,0,index
index+part_size
}
// ブロック解析
repeat
block_type=peek(file_data,index) : index+1
switch block_type
case 0x3B // ブロック終
break
swbreak
case 0x2C // Image Block
block_px=wpeek(file_data,index) : index+2
block_py=wpeek(file_data,index) : index+2
block_width=wpeek(file_data,index) : index+2
block_height=wpeek(file_data,index) : index+2
part_data2=peek(file_data,index) : index+1
block_lctf=part_data2/128
block_if=(part_data2\128)/64
block_sf=(part_data2\64)/32
block_r=(part_data2\32)/8 // 未使用
block_slct=part_data2\8
if block_lctf=1 {
part_size=3
repeat block_slct+1
part_size*2
loop
block_lct=""
memexpand block_lct,part_size
memcpy block_lct,file_data,part_size,0,index
index+part_size
}
block_LZWmcs=peek(file_data,index) : index+1
block_size=0
repeat
block_bs=peek(file_data,index) : index+1
if block_bs=0x00 : break
block_id=""
memexpand block_id,block_size+block_bs
memcpy block_id,file_data,block_bs,block_size,index
block_size+block_bs
index+block_bs
loop
block_sid=block_size // イメージデータのサイズ
; GIFのイメージデータ (lock_id) の解析・描画
swbreak
case 0x21 // 拡張ブロック
block_type=peek(file_data,index) : index+1
switch block_type
case 0xF9 // Graphic Control Extension
block_bs=peek(file_data,index) : index+1 // 必ず4
part_data2=peek(file_data,index) : index+1
block_r=part_data2/32 // 未使用
block_dm=(part_data2\32)/4
block_uif=(part_data2\4)/2
block_tcf=part_data2\2
block_dt=peek(file_data,index) : index+1
block_tci=peek(file_data,index) : index+1
block_bt=peek(file_data,index) : index+1 // 必ず0
swbreak
case 0xFE // Comment Extension
block_size=0
repeat
block_bs=peek(file_data,index) : index+1
if block_bs=0x00 : break
block_cd=""
memexpand block_cd,block_size+block_bs
memcpy block_cd,file_data,block_bs,block_size,index
block_size+block_bs
index+block_bs
loop
block_scd=block_size // コメントデータのサイズ
swbreak
case 0x01 // Plain Text Extension
;
swbreak
case 0xFF // Application Extension
;
swbreak
swend
swbreak
swend
loop

「 ; 」は修正が必要なところです。

ちなみに、下の曲を聴きながらこれ作成してました。(全然関係ないですけど)
佐渡の二ッ岩
他に書くことないんで終わります。では。
↓クリックしてほしい系だったりする。