English 中文(简体)
我如何将.NET位图传递给本地DLL?
原标题:
  • 时间:2009-03-19 03:59:31
  •  标签:

这是我拥有的:

  • 一个我用C语言编写的外部DLL文件。这个DLL文件连接到了OpenCV。我不想直接从C#调用OpenCV——因为已经有大量的C代码访问OpenCV,在这个DLL文件中将被使用。有一个导出函数:passbitmap(void *mem, size_t s);

  • 一个C#项目,我想从中调用DLL。

  • A System.Drawing.Bitmap object from which I want to pass the pixel/bitmap data somehow to my DLL.

我猜这是某种P/Invoke,但我从未尝试过,并且不知道在这种情况下该如何正确地进行。我该如何进行?

最佳回答

你需要调用Bitmap.GetHbitmap()来获取位图的本机句柄。

那么您基本上想做一些本机interop并调用GetDIBits()。最好让您的目标dll实际调用GetDIBits ()并仅传递win32句柄,而不是进行interop。

你需要在从GetDC(NULL)获取的桌面DC上调用CreateCompatibleDC(),然后在刚刚创建的DC上调用CreateCompatibleBitmap()。 然后调用GetDIBits()。

问题回答

C函数原型只需要一个指向缓冲区的指针和缓冲区的大小,它期望在缓冲区中看到什么是一个难题。我的假设/猜测是它是以ByteArray形式的位图位。因此...

我猜这需要被分解成步骤...

[untested, but I think the general idea is sound]

* get the data from your bitmap, into probably a Byte Array
* allocate an unmanaged buffer to store the data
* copy the byte array to the buffer.
* Pass the buffer pointer to your C dll
* Free the buffer when you are done

您可以使用未管理的缓冲区分配

IntPtr pnt = Marshal.AllocHGlobal(size);

你可以使用复制你的字节数组

Marshal.Copy(theByteArray, 0, pnt, theByteArray.Length);

请注意,由于这是未被管理的数据,当你完成后,你将负责释放它。

Marshal.FreeHGlobal(ptr)

请注意,正如@jeffamaphone所说,如果您可以访问c代码,最好只需传递位图句柄。





相关问题
热门标签