アニメーションGIFからイメージデータとグローバル・ローカルカラーテーブル、アプリケーションデータを抜き出すサンプル for HSP by kerupani129 (載せきれないので分割 - その1)

アニメーションGIFからイメージデータとグローバル・ローカルカラーテーブル、アプリケーションデータを抜き出すサンプル for HSP by kerupani129 (載せきれないので分割 - その1)

タイトルのままです。
GIF (89a) から Image Data と Local Color Table と Global Color Table 、Application Data (これはいらない?) を抜き出して保存するサンプルです。

頑張ってここまで来ました。

あとは、イメージデータを解析してデコードする処理だけ…なんですがそれが難しくて…。
※実行前にソースと同じ場所に「dat」というフォルダを作成してください。
自動で作成するようにもできましたが、出力するのが最終目的じゃないんで。

// メモ
//   アニメーション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

Copyright (C) 2012 Kerupani129 Project. All Rights Reserved.
このソースをコピペして、実際に出力してみたり、
データを直接扱いたいがために出力せずに変数に残しておいて、後ろに処理するプログラムを付け足すとかそういうのは許可しますが、改変したものをupするときはコメントぐらいください。(トラバでもいいです。)
その2と連結して使ってください。
↓クリックだけでもお願いします