如何用MATBLAB.NET编译器中的C#将MATLAB MWARRY转换为位图
我搜索了一些例子,但我没有得到任何想法,即使这似乎是一个相对容易的东西,我希望有人可以帮助 我有一个非常简单的MATLAB函数,获取图像的如何用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作为参考,测
字符串文件路径
,并使用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);