アニメーションGIFからイメージデータとグローバル・ローカルカラーテーブル、アプリケーションデータを抜き出すサンプル for HSP by kerupani129 (載せきれないので分割 - その1)
アニメーションGIFからイメージデータとグローバル・ローカルカラーテーブル、アプリケーションデータを抜き出すサンプル for HSP by kerupani129 (載せきれないので分割 - その1)
頑張ってここまで来ました。
// メモ
// アニメーションGIFからイメージデータと
// グローバル・ローカルカラーテーブル、
// アプリケーションデータを
// 抜き出すサンプル for HSP by kerupani129
// 同じ変数を使用している場合、それは同じで大丈夫なのか確認すること。
// 本当に基本的なエラー処理しかしていない。
//最初
file_name="ファイル名。相対パスでも絶対パスでも"
// 読み込み
exist file_name
file_size=strsize
if file_size=-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 // GIFファイルではありません
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 // 対応していないGIFファイルです
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
gct_size=part_size // グローバルカラーテーブルのサイズ
bsave "dat\\gct.dat",gif_gct,gct_size;
}
// ブロック解析
block_nid=0 // 何番目のイメージデータに関する処理か
repeat
block_type=peek(file_data,index) : index+1
switch block_type
case 0x3B // ブロック終
break
swbreak
case 0x2C // Image Block
block_ilp=wpeek(file_data,index) : index+2
block_itp=wpeek(file_data,index) : index+2
block_iw=wpeek(file_data,index) : index+2
block_ih=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
lct_size=part_size // ローカルカラーテーブルのサイズ
bsave "dat\\lct_"+strf("%02d",block_nid)+".dat",block_lct,lct_size;
}
block_LZWmcs=peek(file_data,index) : index+1
block_size=0
block_id=""
repeat
block_bs=peek(file_data,index) : index+1
if block_bs=0x00 : break
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のイメージデータ (block_id) の解析・描画
bsave "dat\\ImageData_"+strf("%02d",block_nid)+".dat",block_id,block_sid;
block_nid+
swbreak