「imgctl.dll」を使用する方法はどうでしょうか。
以下、作ってみたモジュールではDIBtoGIFとDIBtoGIFAniという
簡便に使える関数を使用していますが、
透過GIFとか「無限ループしないアニメーションGIF」のようなものを作る場合は、
細かい指定ができるDIBtoGIFexやDIBtoGIFAniExが必要になると思います。
//使い方:
//「imgctl.dll」を以下のサイトからダウンロードし、ソースコードもしくは実行ファイルと同じフォルダに入れておくこと。
//https://www.vector.co.jp/soft/win95/prog/se222453.html
//
//gifsave p1,p2,p3,p4,p5
//p1 : 保存するGIFファイル名
//p2(0) : 1コマの画像の横幅。省略するか0以下を指定した場合は画像バッファの横幅いっぱい。
//p3(0) : 1コマの画像の縦幅。省略するか0以下を指定した場合は画像バッファの縦幅いっぱい。
//p4(0) : アニメーションGIFの1コマあたりの時間(1/100秒単位)。省略するか0以下を指定した場合は10になる。
//p5(0) : アニメーションGIFの最大コマ数。省略するか0以下を指定した場合は画像バッファの画像を可能な限り使用する。
//
//現在の画像バッファの内容をアニメーションGIFとして保存します。
//現在のバッファの内容は、左上から順にp2×p3のサイズに切り刻まれ、
//それらがアニメーションGIFの1コマ1コマの絵として使用されます。
//p1以外のパラメータをすべて省略するか、「1コマしか存在しない」ような指定の仕方をした場合は、
//アニメーションGIFではなく通常のGIFファイルとして保存されます。
#module
#uselib "imgctl.dll"
#func DeleteDIB "DeleteDIB" int
#cfunc DCtoDIB "DCtoDIB" int,int,int,int,int
#func DIBtoGIF "DIBtoGIF" sptr,int,int
#func DIBtoGIFAni "DIBtoGIFAni" sptr,int,int,int
#define global gifsave(%1,%2=0,%3=0,%4=0,%5=0) _gifsave %1,%2,%3,%4,%5
#deffunc _gifsave str fname,int _w,int _h,int _time,int _num
if _w<=0 : w=ginfo_sx : else : w=limit(_w,,ginfo_sx)
if _h<=0 : h=ginfo_sy : else : h=limit(_h,,ginfo_sy)
x_num=(ginfo_sx/w) : y_num=(ginfo_sy/h)
if _num<=0 : num=limit(x_num*y_num,1) : else : num=limit(x_num*y_num,1,_num)
dim hdib,num
if num=1 {
//1コマのみならアニメGIFではなく通常のGIFを出力
hdib(0)=DCtoDIB(hdc,0,0,w,h)
DIBtoGIF fname,hdib(0),0
DeleteDIB hdib(0)
return
}
repeat num
hdib(cnt)=DCtoDIB(hdc,cnt\x_num*w,cnt/x_num*h,w,h)
loop
if _time<=0 : time=10 : else : time=_time
DIBtoGIFAni fname,varptr(hdib),num,time
repeat num
DeleteDIB hdib(cnt)
loop
return
#global
//以下、使用例。
//同じフォルダに、HSPをインストールしたフォルダにある「sample\tamane2d\素材\baku.bmp」をコピーしてください。
picload "baku.bmp"
gifsave "test.gif",96,96,,16
gifsave "test2.gif"