C#学习教程:如何将.NET位图传递给本机DLL?分享


如何将.NET位图传递给本机DLL?

这是我有的:

我猜它是某种P / Invoke,但我从来没有这样做过,在这种情况下我不知道如何正确地做到这一点。 我该怎么办?

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

然后你基本上想要做一些原生互操作并调用GetDIBits() 。 让你的目标dll实际调用GetDIBits()并传递win32句柄,而不是互操作可能会更好。

您需要在桌面DC上调用CreateCompatibleDC(),它来自GetDC(NULL),然后是您刚刚创建的DC上的CreateCompatibleBitmap()。 然后调用GetDIBits()。

C函数原型只需要一个指向缓冲区的指针和缓冲区的大小,它希望在缓冲区内看到的是$ 64K的问题。 我的假设/猜测是它是ByteArrayforms的Bitmap位。 所以…

我想这需要分解成几步……

[未经测试,但我认为一般的想法是合理的]

*从你的位图获取数据,可能是一个字节数组
*分配一个非托管缓冲区来存储数据
*将字节数组复制到缓冲区。
*将缓冲区指针传递给您的C dll
*完成后释放缓冲区

您可以使用分配非托管缓冲区

IntPtr pnt = Marshal.AllocHGlobal(size); 

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

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

请注意,因为它是非托管数据,所以当您完成后,您将负责释放它。

 Marshal.FreeHGlobal(ptr) 

请注意,正如@jeffamaphone所说,如果您可以访问c代码,那么简单地传递位图句柄会好得多。

上述就是C#学习教程:如何将.NET位图传递给本机DLL?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1031563.html

发表评论

邮箱地址不会被公开。 必填项已用*标注