如何用MATBLAB.NET编译器中的C#将MATLAB MWARRY转换为位图

如何用MATBLAB.NET编译器中的C#将MATLAB MWARRY转换为位图,c#,winforms,matlab,C#,Winforms,Matlab,我搜索了一些例子,但我没有得到任何想法,即使这似乎是一个相对容易的东西,我希望有人可以帮助 我有一个非常简单的MATLAB函数,获取图像的字符串文件路径,并使用rgb2gray(文件路径) 然后使用MATLAB Comiler将其编译为dll文件,类名为ImageProfessioning,以便具有ConvertToGrayScale.dll。没有错误,编译器提供了dll 在C#Winform中, 我在我的C#中包含了两个DLL:MWARRARY和ConvertToGrayScale作为参考,测

我搜索了一些例子,但我没有得到任何想法,即使这似乎是一个相对容易的东西,我希望有人可以帮助

我有一个非常简单的MATLAB函数,获取图像的
字符串文件路径
,并使用
rgb2gray(文件路径)

然后使用MATLAB Comiler将其编译为
dll
文件,类名为
ImageProfessioning
,以便具有
ConvertToGrayScale.dll
。没有错误,编译器提供了
dll

在C#Winform中, 我在我的C#中包含了两个DLL:
MWARRARY
ConvertToGrayScale
作为参考,测试图像直接从
@“D:\\Caputure.PNG”
加载,当用户点击按钮
转换为灰度时,它也显示在
pictureBox1
上,图像被转换并显示在
pictureBox2

using MathWorks.MATLAB.NET.Arrays;
using CovertToGrayScale;


--->我不知道如何将
I
转换为
Bitmap
,以便显示、保存或加载到
MemoryStream
。我选中了
I
,它不是空的,它确实包含灰度图像的数据(使用
I.IsEmpty
I.NumberofElements

C#
中,将字节数组转换为
位图的标准方法使用构造函数重载,如下所示:

Byte[] data = ...;
Bitmap bmp;

using (MemoryStream ms = new MemoryStream(data))
    bmp = new Bitmap(ms);
但是,只有当
数据
数组包含整个图像二进制数据,而不仅仅是像素数据时,这才有效。因此,在这种情况下,事情变得有点困难,因为您从Matlab中检索到的只是一个包含像素信息的
高度乘宽度
矩阵。首先,您必须将
MWArray
转换为扁平
字节[]

MWArray I = imageProcessing.CovertToGrayScale(fileStringArray);
MWNumericArray I_num = I.ToArray();
Byte[] I_bytes = (Byte[])I_num.ToVector(MWArrayComponent.Real);
一旦将灰度像素数据转换为本机
字节
格式,则必须按照以下步骤进行操作(
w
h
是分别表示图像宽度和高度的两个整数…您可以从
I.Dimensions
中指定它们的值):

Bitmap bmp=新位图(w、h、PixelFormat.Format8Bppined);
调色板cp=bmp.palete;
对于(Int32 i=0;i<256;++i)
cp.Entries[i]=Color.FromArgb(255,i,i,i);
bmp.palete=cp;
BitmapData data=bmp.LockBits((新矩形(0,0,bmp.Width,bmp.Height)),ImageLockMode.WriteOnly,bmp.PixelFormat);
Marshal.Copy(I_字节,0,data.Scan0,I_字节,长度);
解锁位(数据);

非常感谢,但我收到了错误
System.ArgumentOutOfRangeException:“请求的范围超出了数组的末尾。”
运行代码时。我写这段代码是盲目的,因为我没有安装框架。至少你能告诉我它发生在哪一行吗?它发生在
Marshal.Copy(I_字节,0,ptr,字节)上没有错误返回,它确实提供了灰度图像,但方式出乎意料-请查看图像这可能是由于MWArray如何转换为字节[]。您必须检查字节沿扫描线排序的顺序。
Byte[] data = ...;
Bitmap bmp;

using (MemoryStream ms = new MemoryStream(data))
    bmp = new Bitmap(ms);
MWArray I = imageProcessing.CovertToGrayScale(fileStringArray);
MWNumericArray I_num = I.ToArray();
Byte[] I_bytes = (Byte[])I_num.ToVector(MWArrayComponent.Real);
Bitmap bmp = new Bitmap(w, h, PixelFormat.Format8bppIndexed);
ColorPalette cp = bmp.Palette;

for (Int32 i = 0; i < 256; ++i)
    cp.Entries[i] = Color.FromArgb(255, i, i, i);

bmp.Palette = cp;

BitmapData data = bmp.LockBits((new Rectangle(0, 0, bmp.Width, bmp.Height)), ImageLockMode.WriteOnly, bmp.PixelFormat);
Marshal.Copy(I_bytes, 0, data.Scan0, I_bytes.Length);
bmp.UnlockBits(data);