【问题标题】:How to create an image from a 2-dimensional byte array?如何从二维字节数组创建图像?
【发布时间】:2010-10-12 22:16:23
【问题描述】:

在我的项目中,经过长时间的处理,我从红外摄像机得到了一个二维字节数组。

字节数组保存图像...

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

我知道

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

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

如果我将二维数组作为一维数组传递..它会显示错误..

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

谢谢!!

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果它是一个矩形数组(即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
        }
    }
    

    我不知道您是否可以在构建位图后取消固定数组 - 如果我将其用于生产代码,我会更仔细地查看。

    【讨论】:

    • Jon Skeet 是不是被打败了,或者 JaredPar 的答案有问题(如果提问者没有,则需要 LINQ)?
    • 我不一定相信 Jared 的解决方案会奏效 - 我将在稍后的评论中解释原因。此外,它还取决于 OP 是否具有 byte[][] 或 byte[,]。
    • 我现在明白了,stackoverflow.com/questions/275073/… 如果有人好奇为什么 byte[,] 不适用于 JaredPar 的答案。
    【解决方案2】:

    如果您希望字节数组按顺序处理,您可以执行以下操作

    byte[][] doubleArray = GetMyByteArray();
    byte[] singleArray = doubleArray.SelectMany(x => x).ToArray();
    MemoryStream ms = new MemoryStream(singleArray);
    System.drawing.Image im = Image.FromStream(ms);
    

    SelectMany 方法本质上接受数组的数组并按顺序返回元素。从第一个数组的第一个元素开始,完成该数组,然后移动到下一个。这将一直持续到处理完所有元素。

    【讨论】:

    • 这不是假设流是某种可识别的图像格式,例如png、jpg、gif?如果 IR 摄像机提供 2D 字节数组,我怀疑它是原始数据 - 这就是我建议我的解决方案的原因。我并不是说这行不通,但具体取决于相机提供的格式。
    • @Jon,完全同意。这在很大程度上取决于相机实际返回的内容。
    • 如果它是一个多维数组,你可以直接转换它,因为你知道类型。 array.Cast().ToArray()
    • 这种方法在速度和内存使用方面都非常糟糕。
    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2015-05-30
    • 2013-09-06
    相关资源
    最近更新 更多