すでに解決されていますが、
このようなところでページが紹介されテンションあがって
モジュールをこさえてしまいました。
せっかくなので投稿(=宣伝)させてください。
; 画面イメージをJPG形式でメモリ(変数)に保存するモジュール&使用サンプル
; ImageMemorySave データを得る変数, JPG圧縮率
; 変数はモジュール内で初期化する。圧縮率は 0〜100 の整数で。
; 実行後のstatはデータのサイズ(Byte)。
#module JpgMemorySave
#uselib "gdiplus" ;イメージ保存関連
#func GdiplusStartup "GdiplusStartup" var, var, nullptr
#func GdiplusShutdown "GdiplusShutdown" int
#func GdipCreateBitmapFromGdiDib "GdipCreateBitmapFromGdiDib" int, int, var
#func GdipDisposeImage "GdipDisposeImage" int
#func GdipSaveImageToStream "GdipSaveImageToStream" int, int, var, var ;画像を変数に保存(使ってみた)
#uselib "kernel32.dll" ;グローバルメモリ関連
#func GlobalLock "GlobalLock" int
#func GlobalUnlock "GlobalUnlock" int
#func GlobalSize "GlobalSize" int
#uselib "Ole32.dll" ;ストリーム関連
#func CreateStreamOnHGlobal "CreateStreamOnHGlobal" int, int, var ;ストリームを生成する
#func GetHGlobalFromStream "GetHGlobalFromStream" int, var ;ストリームの持つグローバルメモリを取得
#deffunc ImageMemorySave array Datas, int Percent
Percentage = Percent ;ポインタをわたすため、変数に代入
mref bmscr, 67 ;HSPのウィンドウ情報
ImageType = $557CF401, $11D31A04, $0000739A, $2EF31EF8 ;保存形式 JPG形式を指定する定数
SavePrm(0) = 1 ;パラメータの数 今回は圧縮率のみなので1コ
SavePrm(1) = $1D5BE4B5, $452DFA4A, $B35DDD9C, $EBE70551 ;圧縮率を意味する定数
SavePrm(5) = 1 ;このパラメータの要素数?
SavePrm(6) = 4 ;このパラメータの型 int型なので4
SavePrm(7) = varptr(Percentage) ;このパラメータの値を代入した変数のポインタ
; SavePrm(8) = ... ;2個目のパラメータを意味する定数から、繰り返し
CreateStreamOnHGlobal 0, 1, hStrm ;グローバルメモリを使ってストリームを生成する
; p1は、グローバルメモリのハンドル (0にするとストリームが内部で生成してくれる)
; p2を、1にするとストリームの解放時にグローバルメモリも削除してくれる...らしい
; p3は、出来あがったストリームのハンドルを受け取る変数
GdipOpenPrm = 1, 0, 0, 0 ;Gdipを使用するためのおまじない
GdiplusStartup hGdip, GdipOpenPrm ;hGdipにハンドルが代入される(解放処理に必要)
GdipCreateBitmapFromGdiDib bmscr(6), bmscr(5), hImage ;HSPのウィンドウから画像を取得して
GdipSaveImageToStream hImage, hStrm, ImageType, SavePrm ;ストリームに指定形式で保存
; 保存に成功すればstatが0になる
GdipDisposeImage hImage ;Gdipの後処理 感謝して閉じる
GdiplusShutdown hGdip
GetHGlobalFromStream hStrm, hGlobal ;ストリームからグローバルメモリを拝借する
GlobalSize hGlobal ;グローバルメモリのサイズ(=ファイルデータのサイズ)は?
DataSize = stat
sdim Datas, DataSize
GlobalLock hGlobal ;グローバルメモリのデータを初期化した変数にコピーする
dupptr DupBuf, stat, DataSize, 2 ; GlobalLock後のstatはアドレス
memcpy Datas, DupBuf, DataSize
GlobalUnlock hGlobal
newcom ComBuf, , -1, hStrm ;ストリームの開放は一度comにしてから
delcom ComBuf ; そのcomを削除するという手続き
return DataSize ;(C) 2012 衣日和 http://www.tvg.ne.jp/menyukko/
#global
dialog "bmp;*.jpg;*.gif", 16, "画像ファイル" ;画像ファイルを選択する
if stat == 0 : end
picload refstr
ImageMemorySave JPGData, 50 ;画面イメージをJPG形式でメモリに保存
FileSize = stat
dialog "データサイズは " + FileSize + "[bytes]です。", 0, "保存結果"
;データチェック1 JPGフォーマットは$D8FFで始まり$D9FFで終わることを利用して
; 頭から尻尾までデータが詰まっていることを確認する。
if wpeek(JPGData, 0) != $D8FF | wpeek(JPGData, filesize - 2) != $D9FF {
dialog "ファイルデータが異常です。", 1, "失敗していました。"
end
}
;データチェック2 ファイルとして読み込んでみる(高圧縮なほどノイズがひどい)
memfile JPGData ;ちなみに、memfile + existでSizeOf()効果を得られる。
screen 1
picload "MEM:JPGdata"
stop
ご存じとは思いますが
GdipSaveImageToFileは、ファイルをハードディスクなどに出力
GdipSaveImageToStreamは、ファイルをメモリに出力
する関数なので、GdipSaveImageToStreamでサイズ調査
GdipSaveImageToFileで保存とすると二度手間になってしまいます。