将byte [,]转换为byte []

时间:2011-01-12 21:45:30

标签: .net image-processing

有没有人知道将C#中的2d数组(非锯齿状)压平为1d然后再返回的有效方法。我知道在后端C#必须保持它作为1d数组我想在后端1d数组上得到一个句柄,如果可能的话。

我之所以这样做是因为我希望能够在托管代码中将其作为2d,有时我想将其作为1d非托管dll导入代码(优化组装)在数字图像处理中就是一个很好的例子。)

4 个答案:

答案 0 :(得分:11)

好吧,对象本身不是byte[],即使它将数据本身放在一个连续的内存块中。不要忘记阵列也知道它的等级和长度等。

但是,您可以使用Buffer.BlockCopy快速复制阵列。例如:

byte[,] source = new byte[5,5];
byte[] dest = new byte[source.Length];
Buffer.BlockCopy(source, 0, dest, 0, source.Length);

请注意,最后一个参数是 bytes 的数量,而不是数组元素的数量。

答案 1 :(得分:3)

从2D索引转到1D索引:

int i = y * width + x;

然后回来:

int x = i % width;
int y = i / width;

然后最简单的是迭代你的数组,逐个复制值。

答案 2 :(得分:3)

您无法从byte[]获取托管byte[,]数组而不将其复制出去(不管怎么说,我都不知道)。

如果您对unsafe代码感到满意,可以在阵列上修复byte*,我相信这应该有效:

fixed (byte* ptr = array)
{
    for (int i = 0; i < N; ++i)
    {
        byte b = ptr[i];
        // Do whatever you need.
    }
}

答案 3 :(得分:0)

var myFlattenedByteArray = my2DByteArray.SelectMany(b=>b).ToArray();

这将以子数组元素顺序返回2D字节数组的每个子数组的每个元素:myFlattenedByteArray [1] == my2DByteArray [0] [1]。可能有更多高性能或高效的解决方案(特别是SelectMany生成的Enumerable对它自己的阵列的淤塞),但它是一个单行的。