Dripです。
aoさん、こんにちは。
画像データ等のファイルをまとめ、様々なデータを付加したい、ということですが、
sdimで付加する情報の長さと画像サイズぶんのメモリを確保し、
情報を書き込み、保存するだけで簡単に実現できます。
ちょっと説明だけでは理解し難いので
以下に画像ファイルに情報を付加するサンプルを示します。
screen 0,400,200
button "読み込み",*load:pos 64,0:button "書き出し",*save:pos 300,4:mes "画像コメント"
pos 0,
sdim msg,256
mesbox msg,400,ginfo_winy-ginfo_cy,5,255
stop
*load
//普通の画像形式とコメントが拡張された画像形式を読み込めるようにする。
dialog "gif;*.jpg;*.bmp;*.xgif;*.xjpg;*.xbmp",16
if stat=0:stop
path=refstr:exist path:buf=strsize
screen 2
switch getpath(path,2+16) //読み込み開始
case ".gif":case ".jpg":case ".bmp":picload path //普通の画像形式なら普通に読み込み
sdim img,buf:bload path,img,buf //書き出しようの画像データを読み込んでおく
swbreak
case ".xgif":case ".xjpg":case ".xbmp" //コメントが拡張された画像形式
sdim p,2:bload path,p,1 //まずコメントの長さを取得
bload path,msg,peek(p,0),1 //コメントの長さ分コメントを読み込む
buf-=peek(p,0)-1 //ファイルサイズからコメントサイズ+1を引いて画像データのサイズにする。
sdim img,buf:bload path,img,buf,peek(p,0)+1 //画像データ読み込み
memfile img //メモリを画像データとして扱う。
picload "MEM:img"+getpath(path,2+16) //メモリから画像読み込み
swbreak
default:swbreak
swend
gsel 0
objprm 2,msg //コメントをメッセージボックスに表示する。
stop
*save
//書き込み処理開始
if strlen(msg)>0:{ //コメントがあればコメント拡張画像形式にする。
k=getpath(path,2+16):if strlen(k)<5:k=".x"+strmid(k,1,3) //拡張子の処理
dialog strmid(k,1,4),17
if stat=0:stop
sdim file,buf+strlen(msg)+1 //メモリ確保
poke file,0,strlen(msg) //コメントの長さを書き込む
memcpy file,msg,strlen(msg),1,0 //コメントを書き込む
memcpy file,img,buf,strlen(msg)+1,0 //画像データを書き込む
bsave getpath(refstr,1)+k,file //データを書き込んだメモリをセーブ
}else{ //コメントがなければ普通の画像形式にする。
k=getpath(path,2+16):if strlen(k)>4:k="."+strmid(k,2,3) //拡張子の処理
dialog strmid(k,1,3),17
if stat=0:stop
bsave getpath(refstr,1)+k,img //画像メモリをセーブ。
}
stop
情報を付加した画像は拡張子にxが追加された特殊な画像データになり、
「読み込み」からコメントと画像を読み込むことが可能です。
このサンプルは1つのファイルにコメントを付加するだけですが、
配列変数やrepeat命令を使えば、複数のファイルをまとめることができます。
サンプルの*load、*saveの部分を入念に理解してみてください。
poke,peek,memcpyなどのメモリ操作関連の命令や関数を中心に理解していけば、
そんなに難しくないはずです。がんばってください。