【发布时间】:2012-11-15 23:15:22
【问题描述】:
在我的 C++ dll 中,我从字节数组创建 Mat:
BYTE * ptrImageData; //Image data is in this array passed to this function
Mat newImg = Mat(nImageHeight, nImageWidth, CV_8UC3, ptrImageData);
创建的图像带有一些灰色阴影,而不是原始图像。
这是从字节数组创建 Mat 的正确方法吗?
请看代码
ptrImageData 从 C# 代码传递给 C++ dll。
传递图像数据的C#代码
System.Drawing.Image srcImage //Has the image
MemoryStream ms = new MemoryStream();
Marshal.FreeHGlobal(ptrImageData);
srcImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imgArray = ms.ToArray();
ms.Dispose();
int size1 = Marshal.SizeOf(imgArray[0]) * imgArray.Length;
IntPtr ptrImageData = Marshal.AllocHGlobal(size1);
Marshal.Copy(imgArray, 0, ptrImageData, imgArray.Length);
//Calling C++ dll function
ProcessImage(ptrImageData, srcImage.Width, srcImage.Height);
Marshal.FreeHGlobal(ptrImageData);
【问题讨论】:
-
我觉得你的C++代码有错误,Mat newImg(...), or Mat* newImg = new Mat(..),你写的不是C++风格。
-
@healer.. 代码是正确的。在上面的代码中,
newImg正在使用Mat类的explicit构造函数进行初始化。 -
请提供更详细的代码,比如你如何显示图像,
ptrImageData的布局是什么。 -
请用代码查看已编辑的问题
-
当您真正需要原始字节时,为什么要将图像保存为 JPEG?你确定
System.Drawing.Image和cv::Mat的字节格式匹配吗?为什么不格式化问题中的示例代码?