我对使用 p/invoke 调用相当陌生,想知道是否有人可以指导我如何从 hbitmap 检索原始像素数据(unsigned char*)。
这是我的场景:
我正在加载一个.NET 位图对象在C#侧并将其 IntPtr 发送到我的非托管 C++ 方法。一旦我收到 hbitmap ptrC++另一方面,我想访问位图的像素数据。我已经制作了一个接受 unsigned char* 的方法,它表示来自 c# 的原始像素数据,但是我发现从 c# 中提取 byte[] 相当慢。这就是为什么我想发送 Bitmap ptr,而不是将 Bitmap 转换为 byte[] 并将其发送到我的 C++ 方法。
获取 Bitmap IntPtr 的 C# 代码
Bitmap srcBitmap = new Bitmap(m_testImage);
IntPtr hbitmap = srcBitmap.GetHbitmap();
用于导入 C++ 方法的 C# 代码
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("MyDll.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int ResizeImage(IntPtr srcImg);
将接收 Hbitmap 处理程序的 C++ 方法
int Resize::ResizeImage(unsigned char* srcImg){
//access srcImgs raw pixel data (preferably in unsigned char* format)
//do work with that
return status;
}
问题:
1) 由于我要发送 IntPrt,我的 C++ 方法参数可以是 unsigned char* 吗?
2)如果没有,我如何从c++访问位图的原始数据?
The GetHbitmap
方法不检索像素数据。它产生一个 GDI 位图句柄,类型为HBITMAP
。您的非托管代码会将其作为类型参数接收HBITMAP
。您可以使用 GDI 调用从中获取像素数据。但它本身并不是原始像素。
事实上,我很确定您正在以错误的方式解决这个问题。你可能正朝这个方向走,因为GetPixel
and SetPixel
很慢。这是千真万确的。事实上,他们的 GDI 同等产品也是如此。你需要做的是使用LockBits。这将使您能够以有效的方式在 C# 中操作整个像素数据。可以在这里找到对该主题的详细描述:https://web.archive.org/web/20141229164101/http://bobpowell.net/lockingbits.aspx。请注意,为了提高效率,这是一种 C# 代码,其中不安全代码和指针通常是最佳解决方案。
如果出于某种原因,您仍然希望使用 C++ 代码操作像素数据,那么您仍然可以使用LockBits
作为获取像素数据指针的最简单方法。它肯定比非托管 GDI 等价物容易得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)