Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从二维字节数组创建图像?_C# - Fatal编程技术网

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

C# 如何从二维字节数组创建图像?,c#,C#,在我的项目中,经过漫长的过程,我从红外摄像机中获得了一个二维字节数组 字节数组在其中保存图像 如何将该字节数组转换为C#中的图像 我知道这一点 MemoryStream ms = new MemoryStream(byteArray); System.drawing.Image im = Image.FromStream(ms); 我们可以传递一维数组并将其转换为图像 如果我将二维数组作为一维数组传递。。它显示了错误 如何纠正它。。????或者如何将二维字节数组转换为图像 谢谢 如果希望按顺序

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

字节数组在其中保存图像

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

我知道这一点

MemoryStream ms = new MemoryStream(byteArray);
System.drawing.Image im = Image.FromStream(ms);
我们可以传递一维数组并将其转换为图像

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

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


谢谢

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

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

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

如果它是一个矩形数组(即
字节[,]
),而不是锯齿状数组(
字节[]][]
),那么您可能只需要使用一些不安全的代码就可以完成

看看我的-只有最下面的一位是有趣的,它从调色板和数据块构造位图:

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
    }
}
byte[]data=query.ToArray();
不安全的
{
固定(字节*ptr=数据)
{
IntPtr scan0=新的IntPtr(ptr);
位图位图=新位图(ImageWidth、ImageHeight、//图像大小
ImageWidth,//扫描大小
PixelFormat.Format8Bppined,扫描0);
调色板=位图。调色板;
palete.Entries[0]=Color.Black;
对于(int i=1;i<256;i++)
{
palete.Entries[i]=Color.FromArgb((i*7)%256,(i*7)%256255);
}
调色板=调色板;
//东西
}
}

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

Jon Skeet被击败了,还是JaredPar的答案有问题(如果询问者没有,则需要LINQ除外)?我不一定相信Jared的解决方案会奏效-我会在一分钟后的评论中解释原因。这还取决于OP是有一个字节[]还是一个字节[],我现在明白了,如果有人好奇为什么字节[],对JaredPar的答案不起作用。这不是假设流是某种公认的图像格式,例如png、jpg、gif吗?如果红外摄像机提供的是2D字节数组,我怀疑这是原始数据——这就是我提出解决方案的原因。我并不是说这行不通,但这取决于相机提供的格式。@Jon,完全同意。这取决于相机实际返回的内容。如果它是一个多维数组,您可以直接对其进行强制转换,因为您知道它的类型。这个方法在速度和内存使用方面都非常糟糕。