如何从二维字节数组创建图像?

时间:2009-03-12 13:52:10

标签: c#

在我的项目经过漫长的过程后,我从红外摄像机获得了一个二维字节数组。

字节数组中包含图像...

如何将该字节数组转换为C#中的图像..

我知道

MemoryStream ms = new MemoryStream(byteArray);
System.drawing.Image im = Image.FromStream(ms);

我们可以传递1维数组并将其转换为图像..

如果我将2维数组作为单维数组传递..它显示错误..

如何纠正它.. ????或者如何将二维字节数组转换为图像...... ???

谢谢!

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方法基本上采用数组数组并按顺序返回元素。从第一个数组的第一个元素开始,完成该数组然后移动到下一个数组。这将继续,直到处理完所有元素。