如何将整数数组分解为字节数组(像素编码)

how to decompose integer array to a byte array (pixel codings)

提问人: 提问时间:12/25/2008 最后编辑:Norman Ramsey 更新时间:9/20/2019 访问量:5615

问:

嗨,很抱歉改写我的问题很烦人,但我只是在发现我的答案。

我有一个由RGB值组成的数组,我需要将该数组分解为字节数组,但它应该按BGR顺序排列。intint

由 RGB 值组成的 int 数组的创建方式如下:

pix[index++] = (255 << 24) | (red << 16) | blue;
C# 数组 RGB 像素

评论


答:

1赞 Can Berk Güder 12/25/2008 #1
#define N something
unsigned char bytes[N*3];
unsigned int  ints[N];

for(int i=0; i<N; i++) {
    bytes[i*3]   = ints[i];       // Blue
    bytes[i*3+1] = ints[i] >> 8;  // Green
    bytes[i*3+2] = ints[i] >> 16; // Red
}

评论

0赞 Can Berk Güder 12/26/2008
这个问题没有说明特定的语言,我现在只看到了 c# 标签。
0赞 Baczek 12/25/2008 #2

r = (pix[index] >> 16) & 0xFF

其余的差不多,只需将 16 更改为 8 或 24。

评论

0赞 Can Berk Güder 12/25/2008
&0xFF如果 r 是 char,则实际上没有必要。
4赞 user21826 12/25/2008 #3

C# 代码


        // convert integer array representing [argb] values to byte array representing [bgr] values
        private byte[] convertArray(int[] array)
        {
            byte[] newarray = new byte[array.Length * 3];
for (int i = 0; i < array.Length; i++) {
newarray[i * 3] = (byte)array[i]; newarray[i * 3 + 1] = (byte)(array[i] >> 8); newarray[i * 3 + 2] = (byte)(array[i] >> 16);
} return newarray; }

1赞 Jay Bazuzi 12/25/2008 #4

使用 Linq:

        pix.SelectMany(i => new byte[] { 
            (byte)(i >> 0),
            (byte)(i >> 8),
            (byte)(i >> 16),
        }).ToArray();

        return (from i in pix
                from x in new[] { 0, 8, 16 }
                select (byte)(i >> x)
               ).ToArray();
1赞 gam6itko 11/16/2011 #5

尝试使用 Buffer 类

byte[] bytes = new byte[ints.Length*4];
Buffer.BlockCopy(ints, 0, bytes, 0, ints.Length * 4);