如何从.net位图获取本机GDI位图

时间:2013-07-15 09:29:44

标签: c++ .net gdi+ gdi

我想使用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());

但它不起作用,你有什么建议?

2 个答案:

答案 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!