掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DLLと画像データをやり取りする型は? (ID:40847)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ぺんたごんさん こんにちは 一般的かどうかは別として、メモリー上にBitmap形式で保存したものを もとにやりとりをすれば、やりやすいのでは? と思います。 例えば、こんな感じ //************* 呼び出し元 ***************** procedure TForm1.Button1Click(Sender: TObject); var Mem : TMemoryStream; hMem : THandle; WHND : THandle; DllName : String; p : Pointer; SaveJpeg : procedure(FName : PChar; hImage,iSize : Cardinal); stdcall; begin if OpenDialog1.Execute then begin Mem := TMemoryStream.Create; try DllName := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)); DllName := DllName + 'JpegSaveDll.Dll'; Mem.Clear; Image1.Picture.LoadFromFile(OpenDialog1.FileName); Image1.Picture.Bitmap.SaveToStream(Mem); Mem.Position := 0; hMem := GlobalAlloc(GHND,Mem.Size); p := GlobalLock(hMem); Mem.Read(p^,Mem.Size); if hMem <> 0 then begin WHND := LoadLibrary(PChar(DllName + #0)); if WHND >= HINSTANCE_ERROR then begin p := GetProcAddress(WHND, 'SaveJpeg'); if p <> nil then begin @SaveJpeg := p; SaveJpeg('E:\test.jpg',hMem); end; end; end; finally Mem.Free; GlobalUnLock(hMem); GlobalFree(hMem); end; end; end; //****************** DLL ***************** type _TStream = class(TCustomMemoryStream); procedure SaveJpeg(FName : PChar; hImage : Cardinal); stdcall; var Jpg : TJpegImage; Bmp : TBitmap; ptr : Pointer; Mem : TMemoryStream; begin jpg := TJpegImage.Create; Bmp := TBitmap.Create; Mem := TMemoryStream.Create; ptr := GlobalLock(hImage); try _TStream(Mem).SetPointer(ptr,GlobalSize(hImage)); Mem.Position := 0; Bmp.LoadFromStream(Mem); Jpg.Assign(Bmp); Jpg.SaveToFile(FName); finally GlobalUnLock(hImage); Jpg.Free; Bmp.Free; Mem.Free; end; end; exports SaveJpeg; //******************* ここまで ****************** 上記の例は、単純にTImageにBitmapを読み込んでメモリーに保存 その後、DLL側でJpegに保存しているだけですが、画像をDLLで編集して 戻したいのであれば、DLL側をfunctionで定義して戻り値をメモリーハンドル にすれば、OKかと。 ただ、Bitmapでやりとりすると、無駄にメモリーを食いますが・・・ Susieなんかだと、BitmapBitsとBitmapInfoのやりとりだったような・・・ うろ覚え・・・ (上記例は、あくまでも手抜きサンプルです。(^^; )
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.