2013-07-15 4 views
5

ich eine .net Bitmap in einer nativen Bibliothek möchte Pinvoke Technologie, die native Funktion hat den folgenden Prototyp,wie einen native GDI-Bitmap aus einer .net Bitmap erhalten

int cropImage( bool aBlocking,Gdiplus::Bitmap *aInputImage,) 

ich worte mit verwenden, die folgende pinvoke

public extern int cropImage(bool blocking , Intptr bitmap) 

und ich es nenne, wie diese

System.Drawing.Bitmap b = new Syste.Drawing.Bitmap("Amour.jpg"); 
cropImage(true,b.getHitmap()); 

aber es funktioniert nicht, was tun Sie sugge st?

Antwort

0

Ich schlage vor, dass der beste Weg, um dieses Problem zu überwinden, eine native Bibliothek verwenden, die eine HBitmap akzeptieren und dann CBitmap :: fromHandle Funktion verwenden und rufen Sie dann die API, mit der Sie kommunizieren möchten!

2

Gdiplus :: Bitmap ist eine C++ - Klasse, die in der Windows SDK-Headerdatei <GdiPlusHeaders.h> deklariert ist. Es ist eine Wrapper-Klasse, um die eher unfreundliche Low-Level-GDI + C-Schnittstelle einfacher zu verwenden. System.Drawing.Bitmap ist nicht ein direkter Ersatz für diese C++ - Klasse, es ist auch eine Wrapper-Klasse um die Low-Level-GDI + API, sondern in C# geschrieben. Es hat überhaupt keine Beziehung mit dem C++ - Wrapper. Die Verwendung von HBITMAP, die Sie von Bitmap.GetHbitmap() erhalten, wird auch nicht funktionieren, das ist ein Handle, kein C++ - Objekt.

Sie können diese Funktion nicht direkt von C# aufrufen, pinvoke unterstützt nicht das Erstellen von C++ - Objekten. Sie müssen einen Ref-Klasse Wrapper in der C++/CLI-Sprache schreiben. Eine Sprache, die das Schreiben von verwaltetem Code und das Aufrufen von systemeigenem C++ - Code ohne Pin-Vooke unterstützt. Und Sie können #include <gdiplus.h> nach Bedarf, so dass Sie das Gdiplus :: Bitmap-Objekt erstellen können. Ein anderer Ansatz besteht darin, eine DLL unter Verwendung von C++ zu erstellen, die zwei exportierte Funktionen hat, eine, die eine Gdiplus :: Bitmap erzeugt, und eine andere, die sie zerstört. Dadurch können Sie pinvoke verwenden und das Argument stattdessen als IntPtr deklarieren.