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 _cbufcbuf = _cbufif cbuf = 0 : cbuf = 32dimtype pstm, vartype("comobj"), cbufdim _id, cbufdim token, cbufdim hGlobal, cbufdim ppstm, cbufdim ppImg, cbufpGraphics = 0return#deffunc mem_picload int id, var data, int sizeif _id(id) != 0 : return -2 // ID使用中if size <= 0 : return -3 // ファイルサイズ異常if id >= cbuf : return -4 // 管理できるのは 0 ~ cbuf まで//初期化dim GdiplusStartupInput, 4GdiplusStartupInput = 1, 0, 0, 0GdiplusStartup token(id), GdiplusStartupInput, 0hGlobal(id) = GlobalAlloc(2, size+1)dupptr tmp, GlobalLock(hGlobal.id), size, 2memcpy tmp, data, sizeGlobalUnLock hGlobal(id)if CreateStreamOnHGlobal(hGlobal(id), 1, ppstm(id)) = 0{newcom pstm(id), IStream, -1, ppstm(id)GdipLoadImageFromStream pstm(id), ppImg(id)}_id(id) = 1return#deffunc mem_picgetsize int id, var x, var yif _id(id) = 0 : return -1 // 未確保IDdupptr pImg, ppImg(id), 4GdipGetImageWidth ppImg(id), varptr(x)GdipGetImageHeight ppImg(id), varptr(y)return#deffunc mem_picrectscreen int id, int x1, int y1, int x2, int y2if _id(id) = 0 : return -1 //未確保IDdupptr pImg, ppImg(id), 4GdipCreateFromHDC hdc, pGraphicsdupptr Graphics, pGraphics, 4GdipDrawImageR Graphics, pImg, x1, y1, x2, y2GdipDeleteGraphics Graphicsredraw 1return#deffunc mem_pictoscreen int id, int x1, int y1if _id(id) = 0 : return -1 //未確保IDdupptr pImg, ppImg(id), 4GdipCreateFromHDC hdc, pGraphicsdupptr Graphics, pGraphics, 4GdipDrawImage Graphics, pImg, x1, y1GdipDeleteGraphics Graphicsredraw 1return#deffunc mem_picfree int idif _id(id) = 0 : return -1 //未確保IDdupptr pImg,ppImg(id), 4GdipDisposeImage pImgGlobalFree hGlobal(id)GdiplusShutdown token(id)delcom pstm(id)_id(id) = 0return#deffunc picload_ex str fname, var x, var yexist fnameif strsize = -1 : return -1if varptr(GdiplusStartup) = 0 : return -2 // GDI+が使用できなかったsize = strsizemem_picinit 1notesel bufnoteload fnamemem_picload 0, buf, sizemem_picgetsize 0, x, ymem_picrectscreen 0, 0, 0, x, ymem_picfree 0sdim buf, 64return#deffunc picload_ex2 str fname,int _x1, int _y1,int _x2, int _y2, var x, var yexist fnameif strsize = -1 : return -1if varptr(GdiplusStartup) = 0 : return -2 // GDI+が使用できなかったsize = strsizemem_picinit 1notesel bufnoteload fnamemem_picload 0, buf, sizemem_picgetsize 0, x, ymem_picrectscreen 0, _x1, _y1, _x2, _y2mem_picfree 0sdim buf, 64return#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 風にwmem_picfree 0 // 使わなくなったら開放#endif