在我的项目经过漫长的过程后,我从红外摄像机获得了一个二维字节数组。
字节数组中包含图像...
如何将该字节数组转换为C#中的图像..
我知道
MemoryStream ms = new MemoryStream(byteArray);
System.drawing.Image im = Image.FromStream(ms);
我们可以传递1维数组并将其转换为图像..
如果我将2维数组作为单维数组传递..它显示错误..
如何纠正它.. ????或者如何将二维字节数组转换为图像...... ???
谢谢!
答案 0 :(得分:5)
如果它是一个矩形数组(即byte[,]
)而不是锯齿状数组(byte[][]
),那么你可以能够用一些不安全的代码完成它
看看我的parallel Mandelbrot set generation code - 只有底部位有趣,它从调色板和数据块构造一个位图:
byte[] data = query.ToArray();
unsafe
{
fixed (byte* ptr = data)
{
IntPtr scan0 = new IntPtr(ptr);
Bitmap bitmap = new Bitmap(ImageWidth, ImageHeight, // Image size
ImageWidth, // Scan size
PixelFormat.Format8bppIndexed, scan0);
ColorPalette palette = bitmap.Palette;
palette.Entries[0] = Color.Black;
for (int i=1; i < 256; i++)
{
palette.Entries[i] = Color.FromArgb((i*7)%256, (i*7)%256, 255);
}
bitmap.Palette = palette;
// Stuff
}
}
我不知道你是否可以在构造位图后取消固定数组 - 如果我将它用于生产代码,我会仔细研究它。
答案 1 :(得分:2)
如果要按顺序处理字节数组,可以执行以下操作
byte[][] doubleArray = GetMyByteArray();
byte[] singleArray = doubleArray.SelectMany(x => x).ToArray();
MemoryStream ms = new MemoryStream(singleArray);
System.drawing.Image im = Image.FromStream(ms);
SelectMany方法基本上采用数组数组并按顺序返回元素。从第一个数组的第一个元素开始,完成该数组然后移动到下一个数组。这将继续,直到处理完所有元素。