GDI+ を使用してメモリから画像を表示する Mem_Picload の Ver 1.01 です。解放されないバグを修正しました。
GDI+ を使用してメモリから画像を表示する Mem_Picload の Ver 1.01 です。解放されないバグを修正しました。
/*************************************************************** [ Mem_Picload ] Version 1.01 - BMP, GIF, JPEG, PNG, TIFF など GDI+ がサポートするファイル をメモリ上から開くことが出来るようになります。 ※ Windows XP 以前は 再配布可能 GDI+「gdiplus.dll」が必要 HSP3 のパックファイルに入れても読み取ることが可能 作者 : イノビア ( http://homepage2.nifty.com/MJHS/ ) ■ 自由に組み込み可、改造大歓迎、改造した物公開OK ***************************************************************/ #module _mem_pic_ #define IID_IStream "{0000000C-0000-0000-C000-000000000046}" #define CLSID_Stream "{00000320-0000-0000-C000-000000000046}" #usecom IStream IID_IStream CLSID_Stream #uselib "kernel32" #cfunc GlobalAlloc "GlobalAlloc" int,int #cfunc GlobalLock "GlobalLock" int #func GlobalUnlock "GlobalUnlock"int #func GlobalFree "GlobalFree"int #uselib "ole32" #cfunc CreateStreamOnHGlobal "CreateStreamOnHGlobal" int,int,var #uselib "gdiplus" #func GdiplusStartup "GdiplusStartup" var,var,int #func GdipCreateFromHDC "GdipCreateFromHDC" int,var #func GdipDeleteGraphics "GdipDeleteGraphics" var #func GdipGetImageWidth "GdipGetImageWidth" int,int #func GdipGetImageHeight "GdipGetImageHeight" int,int #func GdipDrawImage "GdipDrawImageI" var,var,int,int #func GdipDrawImage2 "GdipDrawImage" var,var,int,int #func GdipDrawImageR "GdipDrawImageRectI" var,var,int,int,int,int #func GdipDisposeImage "GdipDisposeImage" var #func GdiplusShutdown "GdiplusShutdown" var #func GdipLoadImageFromStream "GdipLoadImageFromStream" comobj,var #deffunc mem_picinit int _cbuf cbuf = _cbuf if cbuf = 0 : cbuf = 32 dimtype pstm, vartype("comobj"), cbuf dim _id, cbuf dim token, cbuf dim hGlobal, cbuf dim ppstm, cbuf dim ppImg, cbuf pGraphics = 0 return #deffunc mem_picload int id, var data, int size if _id(id) != 0 : return -2 // ID使用中 if size <= 0 : return -3 // ファイルサイズ異常 if id >= cbuf : return -4 // 管理できるのは 0 ~ cbuf まで //初期化 dim GdiplusStartupInput, 4 GdiplusStartupInput = 1, 0, 0, 0 GdiplusStartup token(id), GdiplusStartupInput, 0 hGlobal(id) = GlobalAlloc(2, size+1) dupptr tmp, GlobalLock(hGlobal.id), size, 2 memcpy tmp, data, size GlobalUnLock hGlobal(id) if CreateStreamOnHGlobal(hGlobal(id), 1, ppstm(id)) = 0{ newcom pstm(id), IStream, -1, ppstm(id) GdipLoadImageFromStream pstm(id), ppImg(id) } _id(id) = 1 return #deffunc mem_picgetsize int id, var x, var y if _id(id) = 0 : return -1 // 未確保ID dupptr pImg, ppImg(id), 4 GdipGetImageWidth ppImg(id), varptr(x) GdipGetImageHeight ppImg(id), varptr(y) return #deffunc mem_picrectscreen int id, int x1, int y1, int x2, int y2 if _id(id) = 0 : return -1 //未確保ID dupptr pImg, ppImg(id), 4 GdipCreateFromHDC hdc, pGraphics dupptr Graphics, pGraphics, 4 GdipDrawImageR Graphics, pImg, x1, y1, x2, y2 GdipDeleteGraphics Graphics redraw 1 return #deffunc mem_pictoscreen int id, int x1, int y1 if _id(id) = 0 : return -1 //未確保ID dupptr pImg, ppImg(id), 4 GdipCreateFromHDC hdc, pGraphics dupptr Graphics, pGraphics, 4 GdipDrawImage Graphics, pImg, x1, y1 GdipDeleteGraphics Graphics redraw 1 return #deffunc mem_picfree int id if _id(id) = 0 : return -1 //未確保ID dupptr pImg,ppImg(id), 4 GdipDisposeImage pImg GlobalFree hGlobal(id) GdiplusShutdown token(id) delcom pstm(id) _id(id) = 0 return #deffunc picload_ex str fname, var x, var y exist fname if strsize = -1 : return -1 if varptr(GdiplusStartup) = 0 : return -2 // GDI+が使用できなかった size = strsize mem_picinit 1 notesel buf noteload fname mem_picload 0, buf, size mem_picgetsize 0, x, y mem_picrectscreen 0, 0, 0, x, y mem_picfree 0 sdim buf, 64 return #deffunc picload_ex2 str fname,int _x1, int _y1,int _x2, int _y2, var x, var y exist fname if strsize = -1 : return -1 if varptr(GdiplusStartup) = 0 : return -2 // GDI+が使用できなかった size = strsize mem_picinit 1 notesel buf noteload fname mem_picload 0, buf, size mem_picgetsize 0, x, y mem_picrectscreen 0, _x1, _y1, _x2, _y2 mem_picfree 0 sdim buf, 64 return #global /* ------------------------------------------------------------------------ mem_picinit p1(32) mem_ 関連の命令を初期化します。初回のみ実行してください。 p1 は 利用可能なID 範囲を決めます。 何も書かないと、デフォルトで 32 になります。 ------------------------------------------------------------------------ mem_picload p1,p2,p3 メモリ上にある画像ファイルを読み込みます。 BMP, GIF, JPEG, PNG, TIFF などが読み込み可能です。 p1 は ID を指定します。 p2 は データの変数を指定します。 p3 は データの大きさ(サイズ)を指定します。 ------------------------------------------------------------------------ mem_picgetsize p1,p2,p3 画像のサイズ(縦横)を取得します。 p1 は mem_picloadで指定したIDを入れます。 p2 は 画像の X サイズを入れるための変数を指定。 p3 は 画像の Y サイズを入れるための変数を指定。 ------------------------------------------------------------------------ mem_pictoscreen p1,p2,p3 画像をHSPの画面に転送します。 等倍のまま転送されます。 p1 は mem_picloadで指定したIDを入れます。 p2 は 表示する位置(左上 X 座標) p3 は 表示する位置(左上 Y 座標) ------------------------------------------------------------------------ mem_picrectscreen p1,p2,p3,p4,p5 画像をHSPの画面に転送します。 変形して転送可能です。 p1 は mem_picloadで指定したIDを入れます。 p2 は 表示する位置(左上 X 座標) p3 は 表示する位置(左上 Y 座標) p4 は 表示する画像の X サイズ p5 は 表示する画像の Y サイズ ------------------------------------------------------------------------ mem_picfree p1 読み込んだ画像を開放します。 使用が終わりましたら、必ず開放してください。 p1 は mem_picloadで指定したIDを入れます。 ------------------------------------------------------------------------ ※ エラー値について stat = 2 : 画像ロードエラー? ( GDI+ API ) stat = -1 : そのIDは利用されていません stat = -2 : そのIDは使用中の為、確保できません stat = -3 : ファイルサイズが異常です stat = -4 : 利用できないIDの範囲です ・0以外が返ってきたら基本的にエラーと考えてください ------------------------------------------------------------------------ */ //以下サンプル #if 0 //ここの値を1にするとサンプルが実行されます。 //下準備 fname = "testpic.png" //ファイル名 exist fname : ret = strsize //ファイルサイズを取得(パックしても使える) sdim data, ret //メモリを確保 bload fname, data //メモリにデータを読み込み(パックしても使える) mem_picinit //初期化(初回1回のみ) mem_picload 0, data, ret // メモリから読み込み(ID = 0) mem_picgetsize 0, x, y // 画像のサイズを取得 mem_picrectscreen 0, 0, 0, x, y // HSPのウィンドウに 左上0,0 サイズx,yで転送 width x, y // picload ,0 風にw mem_picfree 0 // 使わなくなったら開放 #endif