Mat*_*hew 6 c# c++ pinvoke bitmap
我是一个相当新的使用p/invoke调用,我想知道是否有人可以指导我如何从hbitmap检索原始像素数据(unsigned char*).
这是我的情景:
我在C#端加载一个.NET Bitmap对象,并将它的IntPtr发送到我的非托管c ++方法.一旦我在C++端收到hbitmap ptr ,我想访问Bitmaps 的像素数据.我已经创建了一个接受unsigned char*的方法,它表示来自c#的原始像素数据但是我发现从c#中提取byte []相当慢.这就是为什么我想发送Bitmap ptr而不是将Bitmap转换为byte []并将其发送到我的C++方法.
用于获取Bitmap IntPtr的C#代码
Bitmap srcBitmap = new Bitmap(m_testImage);
IntPtr hbitmap = srcBitmap.GetHbitmap();
Run Code Online (Sandbox Code Playgroud)
用于导入c ++方法的C#代码
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("MyDll.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int ResizeImage(IntPtr srcImg);
Run Code Online (Sandbox Code Playgroud)
将接收Hbitmap处理程序的C++方法
int Resize::ResizeImage(unsigned char* srcImg){
//access srcImgs raw pixel data (preferably in unsigned char* format)
//do work with that
return status;
}
Run Code Online (Sandbox Code Playgroud)
问题:
1)由于我发送的是IntPrt,我的C++方法参数可以是unsigned char*吗?
2)如果没有,我如何从c ++访问位图的原始数据?
该GetHbitmap
方法不检索像素数据。它产生一个 GDI 位图句柄,类型为HBITMAP
。您的非托管代码会将其作为 type 参数接收HBITMAP
。您可以使用 GDI 调用从中获取像素数据。但它本身并不是原始像素。
事实上,我很确定您正在以错误的方式解决这个问题。你可能会走这条路,因为GetPixel
而且SetPixel
速度很慢。这很真实。事实上,它们的 GDI 等价物也是如此。您需要做的是使用LockBits
. 这将允许您以有效的方式在 C# 中操作整个像素数据。可以在此处找到对该主题的良好描述:https : //web.archive.org/web/20141229164101/http : //bobpowell.net/lockingbits.aspx。请注意,为了提高效率,这是一种 C# 代码,其中不安全的代码和指针通常是最佳解决方案。
如果出于某种原因,您仍然希望使用 C++ 代码对像素数据进行操作,那么您仍然可以使用LockBits
作为获取像素数据指针的最简单方法。它肯定比非托管 GDI 等价物容易得多。