#module
#define ctype BigEndianInt(%1) (%1 >> 24 & 255) | ((%1 >> 16 & 255) << 8) | ((%1 >> 8 & 255) << 16) | (( %1 & 255) << 24)
#define ctype wBigEndianInt(%1) (%1 >> 8) | (%1 & 255) << 8
/*
p1 画像のパス
jpegの場合、正常に完了するとstatが0。
jpegでサイズが取得できなかった場合は-1が返ります。
pngは1、bmpは2が返ります。
つまり正常に終了した場合、0以上が返ります。
jpeg以外はサイズが書き込まれている位置が固定なので、
取得できないことはあり得ませんが、
正常な値が取得されているとは限りません。
*/
#deffunc GetImg str p1
if ct=0:{//初回に限り変数を初期化。
//ファイルの0バイト目から取得する長さ。
//明確に何バイト目までにサイズが書かれているか調べてもわからなかったので、
//手元のファイルを元に適当に設定。
長さ=1024
sdim Fbin,長さ
sdim bin,長さ*2+1
ct=1
}
bload p1,Fbin,長さ,0//ロード
repeat 3//バイナリデータを扱いやすいように変換
poke bin,cnt*2,strf("%02x",peek(Fbin,cnt))
loop
状態=0
形式=-2
//0バイト目~数バイトを調べて形式を判定。
if instr(bin,0,"ffd8")=0:{//jpeg
repeat 長さ-3//バイナリデータを扱いやすいように変換
poke bin,6+(cnt*2),strf("%02x",peek(Fbin,cnt+3))
loop
in=instr(bin,0,"ffc00011")//サイズの位置が可変なので、サイズの始まりを示す文字を検索。
if in!-1:{//発見できたら処理。
in+10
//sx=strf("%d",int("$"+strmid(bin,in+4,4)))
//sy=strf("%d",int("$"+strmid(bin,in+0,4)))
sx=int(strf("%d",wBigEndianInt(wpeek(Fbin,(in/2)+2))))//これでいいはず・・・?
sy=int(strf("%d",wBigEndianInt(wpeek(Fbin,(in/2)))))//でも何故かうまくいかない。
}else:状態=-1//出来なかったら
形式=0
}
//jpeg以外はサイズが書き込まれている位置が固定なのでjpegより簡単。
if instr(bin,0,"89504e")=0:{//png
sx=int(strf("%d",BigEndianInt(lpeek(Fbin,16))))
sy=int(strf("%d",BigEndianInt(lpeek(Fbin,20))))
形式=1
}
if instr(bin,0,"424d")=0:{//bmp
//リトルエンディアンで書かれているので注意。
sx=int(strf("%d",wpeek(Fbin,18)))
sy=int(double(strf("%d",wpeek(Fbin,3)))/22.5)
形式=2
}
if instr(bin,0,"474946")=0:{//gif
//リトルエンディアン
sx=int(strf("%d",wpeek(Fbin,6)))
sy=int(strf("%d",wpeek(Fbin,8)))
形式=3
}
if instr(bin,0,"00000a")=0:{//tga
//リトルエンディアン
sx=int(strf("%d",wpeek(Fbin,12)))
sy=int(strf("%d",wpeek(Fbin,14)))
形式=4
}
return (状態+形式)
//取得できたサイズを返す。
#defcfunc Gsx
return sx
#defcfunc Gsy
return sy
#global
#include "winmm.as"//pcの起動時間を測定
n=1000.0
button "開く",*開く
stop
*開く
dialog "",16,"画像"
if stat=1:{
timegettime:開始時間=stat
//n回の平均
repeat n
GetImg refstr
st=stat
if st=-2:形式="未知"
if st=-1:形式="JPEG(サイズの取得に失敗)"
if st=0:形式="JPEG"
if st=1:形式="PNG"
if st=2:形式="BMP"
if st=3:形式="GIF"
if st=4:形式="TGA"
loop
timegettime
終了時間=stat
Color 255,255,255:boxf:Color 0,0,0
pos 10,50:mes "形式"+形式+"\n"+gsx()+"x"+gsy()+"\n"+(double(終了時間-開始時間)/n)+""
}
かなり前に書いたコードで、自分でも何故そうやってるのかよく分からない部分があります。
特にwpeekで取得した16進のサイズをstrfで10進に変換してint型を変換して・・・という部分は、
なんかもっと簡単なやり方があると思います。
また、以下のスレでFlatさんが同じようなモジュールを投稿しています。
http://hsp.tv/play/pforum.php?mode=pastwch&num=72960