C# 将三维字节数组转换为单字节数组

C# 将三维字节数组转换为单字节数组,c#,multidimensional-array,flatten,C#,Multidimensional Array,Flatten,我有一个三维字节数组 三维数组表示jpeg图像。每个通道/阵列代表RGB频谱的一部分 我对保留黑色像素不感兴趣。黑色像素由这种非典型排列表示: myarray[0,0,0] =0; myarray[0,0,1] =0; myarray[0,0,2] =0; 因此,我将这个3d数组展平为1d数组,方法是这样做byte[]AFlatArray=new byte[width x height x 3],然后分别为坐标赋值 但就像我说的,我不想要黑色像素。所以这个数组只能包含x,y坐标的彩色像素。我想

我有一个三维字节数组

三维数组表示jpeg图像。每个通道/阵列代表RGB频谱的一部分

我对保留黑色像素不感兴趣。黑色像素由这种非典型排列表示:

myarray[0,0,0] =0;
myarray[0,0,1] =0;
myarray[0,0,2] =0;
因此,我将这个3d数组展平为1d数组,方法是这样做
byte[]AFlatArray=new byte[width x height x 3]
,然后分别为坐标赋值

但就像我说的,我不想要黑色像素。所以这个数组只能包含x,y坐标的彩色像素。我想要的结果是重新表示仅包含非黑色像素的I维字节数组中的图像。我该怎么做

由于xy坐标系的原因,看起来我也必须存储黑色像素。我曾尝试写入二进制文件,但当压缩jpeg文件时,该文件的大小大于jpeg文件


我需要一个单字节数组,因为我有一个图像,其中有红绿色和蓝色的组成部分。我想存储两个图像之间的差异。这是一个3维的阵列。由于并非所有像素都会不同,我只想存储差异。但是,即使平展图像的大小也仍然大于图像的字节大小(因为它是jpeg压缩图像)


我使用的是emgu图像框架。当您枚举图像的数据时,它可以为您提供3个通道,每个通道由字节数组中的一个维度表示。我正在使用的3个频道是(R)ed、(G)reen和(B)lue。我可以在HSL或HSV(etc)的颜色空间中工作,然后我可以使用色调、饱和度和亮度的3个通道。

将三个维度相乘,计算总大小,分配结果数组,并使用三个嵌套循环–每个维度一个。为输出阵列中的当前位置制作计数器;在将项目放入输出数组时递增该计数器-如下所示:

byte[,,] threeD = new byte[X,Y,Z];
byte[] res = new byte[X*Y*Z];
int pos = 0;
for (int x = 0 ; x != X ; x++)
    for (int y = 0 ; y != Y ; y++)
        for (int z = 0 ; z != Z ; z++)
            res[pos++] = threeD[x,y,z];
如果不是数组:

byte[]newArray=新字节[oldArray.Length];
for(int i=0;i
或者,在单个循环中:

   byte[] newArray = new byte[oldArray.Length];
   for (int i = 0; i < oldArray.Length; i++) {
       int ind3 = i % oldArray.GetLength(2);
       int ind2 = i / oldArray.GetLength(2) % oldArray.GetLength(1);
       int ind1 = i / (oldArray.GetLength(1) * oldArray.GetLength(2));
       newArray[i] = oldArray[ind1, ind2, ind3];
   }
byte[]newArray=新字节[oldArray.Length];
for(int i=0;i

如果它是一个锯齿状数组,那么您将不知道3D数组中元素的确切总数。在这种情况下,我将使用一个列表,在将元素添加到列表中的同时在三维中循环,然后使用list.ToArray()将列表转换为一维数组。

出于好奇,为什么需要单字节数组?:)@minitech我有一个图像,它有红绿色和蓝色的组件。我想存储两个图像之间的差异。这是一个3维的阵列。由于并非所有像素都会不同,我只想存储差异。但是,即使平展图像的大小也仍然大于图像的字节大小(因为它是jpeg压缩图像)。所以,没有人回答我的问题,但他们确实回答了这个问题。我不明白两个图像之间的差异是如何形成一个三维阵列的。你是说一维有三个部分(RGB)?@minitech Hi,我使用的是emgu图像框架。当您枚举图像的数据时,它可以为您提供3个通道,每个通道由字节数组中的一个维度表示。我正在使用的3个频道是(R)ed、(G)reen和(B)lue。我可以在HSL或HSV(等)的颜色空间中工作,然后我可以在色调、饱和度和亮度的3个通道中工作。新答案是禁止的,但你可以使用
缓冲区在一行中完成。BlockCopy
哦,是的,抱歉,不知道那里发生了什么
   byte[] newArray = new byte[oldArray.Length];
   for (int i = 0; i < oldArray.Length; i++) {
       int ind3 = i % oldArray.GetLength(2);
       int ind2 = i / oldArray.GetLength(2) % oldArray.GetLength(1);
       int ind1 = i / (oldArray.GetLength(1) * oldArray.GetLength(2));
       newArray[i] = oldArray[ind1, ind2, ind3];
   }