我编写了这个示例代码来解释我的问题。我在VS 2013中有一个解决方案,包含一个C#项目和一个C++项目。我尝试用C++(x86)中的OpenCV读取图像。并希望将一个C#x86项目(使用CLR模式)传递给位图对象,然后将BitmapImage对象用作WPF图像源。
我的C++代码:将opencv图像cv :: Mat格式转换为C#BitmapImage
Bitmap^ SomeClass::Test(System::String^ imgFileName)
{
auto fileName = msclr::interop::marshal_as<string>(imgFileName);
Mat img = imread(fileName);
//Do something
auto bmp = gcnew Bitmap(img.cols, img.rows, img.step, Imaging::PixelFormat::Format24bppRgb, (IntPtr)img.data);
bmp->Save("InC++Side.png");
return bmp;
}
我的C#代码:
private void ImageTester(object sender, RoutedEventArgs e)
{
var image = testClass.Test("test.png");
image.Save("InC#Side.png");
bg.Source = ConvertToBitmapImageFromBitmap(image);
}
public static BitmapImage ConvertToBitmapImageFromBitmap(Bitmap image)
{
using(var ms = new MemoryStream())
{
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
BitmapImage bImg = new BitmapImage();
bImg.BeginInit();
bImg.StreamSource = new MemoryStream(ms.ToArray());
bImg.EndInit();
return bImg;
}
}
问题是,C++(INC++ Side.png)保存的文件是完美的;但在C#中呈现Bitmap对象的另一个只是带有该图像高度和宽度的灰色矩形。
问题在哪里?
如何将图像传递给我的C#项目?
“将图像传递给C#项目”是什么意思?你是否创建了一个单一的应用程序(即C#项目)并使用OpenCV C++ API来从文件加载图像? – enzom83
@ enzom83:是的。我有一个解决方案,它有一个C#项目在UI上显示图像,使用OpenCV的C++项目。我不使用OpenCV来从原始项目中的文件加载图像;但在这个例子中,是的。我只是加载图像。 – aisa
您可以将'Mat'转换为'byte'数组(参见[本答案](http://answers.opencv.org/question/33596/convert-mat-to-byte-in-c/?answer=33603# post-id-33603)),然后尝试使用[本答案](http://stackoverflow.com/a/10214278)中描述的过程。此外,你是否尝试将'(IntPtr)img.data'更改为'img.data.ptr'? – enzom83