我想使用Pinvoke技术在本地库中使用.net位图,本机函数具有以下原型,
int cropImage( bool aBlocking,Gdiplus::Bitmap *aInputImage, )
我打了下面的pinvoke
public extern int cropImage( bool blocking , Intptr bitmap )
我称之为
System.Drawing.Bitmap b = new Syste.Drawing.Bitmap("Amour.jpg");
cropImage(true,b.getHitmap());
但它不起作用,你有什么建议?
答案 0 :(得分:3)
Gdiplus :: Bitmap是一个C ++类,它在<GdiPlusHeaders.h>
Windows SDK头文件中声明。它是一个包装类,使相当不友好的低级GDI + C接口更容易使用。 System.Drawing.Bitmap是不直接替代这个C ++类,它也是一个围绕低级GDI + api的包装类,但用C#编写。它与C ++包装器完全没有任何关系。使用从Bitmap.GetHbitmap()获得的HBITMAP也不会工作,它是句柄,而不是C ++对象。
您不能直接从C#调用此函数,pinvoke不支持创建C ++对象。您需要使用C ++ / CLI语言编写 ref class 包装器。一种支持编写托管代码和调用本机C ++代码而不需要pinvoke的语言。您可以根据需要#include <gdiplus.h>
创建Gdiplus :: Bitmap对象。另一种方法是使用C ++创建一个DLL,它有两个导出函数,一个用于创建Gdiplus :: Bitmap,另一个用于销毁它。这将允许您使用pinvoke,将参数声明为IntPtr。
答案 1 :(得分:0)
我建议解决此问题的最佳方法是使用接受HBitmap的本机库,然后使用CBitmap :: fromHandle函数,然后调用您尝试与之通信的api!