10

我对 C# 很陌生,并试图做一个基本的图像处理软件。我了解此代码段从 WriteableBitmap 像素“当前”的 ARGB int 值中提取 A、R、G、B

for(int i = 0; i < bitmapArray.Length; i++) {
    var current = bitmapArray[i];

    var alpha = (byte)(current >> 24);
    var red = (byte)(current >> 16);
    var green = (byte)(current >> 8);
    var blue = (byte)(current);
    //Some code
 }

“>>”是做什么来转换值的?

另外,如果我分别对 r、g 和 b 进行一些计算,如何将它们转换回整数 ARGB 值以用新像素替换原始像素?

提前致谢。

编辑:谢谢大家,现在说得通了。

4

3 回答 3

16

它是二元移位运算符。

如果您有由 (a, r, g, b) 定义的颜色,它的二进制表示将如下所示(假设通道深度为 8 位):

AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB

所以,把整个东西移到 24 个位置,你就剩下 alpha 通道了

AAAAAAAA

移位 16 得到 alpha 通道和红色通道

AAAAAAAARRRRRRRR

现在,由于它被转换为一个字节,因此只提取了前 8 位

(byte)AAAAAAAARRRRRRRR == RRRRRRRR

您还可以通过移动 16 个位置并与 11111111 (0xFF) 进行与运算来获得红色通道

AAAAAAAARRRRRRRR &
0000000011111111
----------------
00000000RRRRRRRR
于 2010-08-15T00:38:38.917 回答
12

它将current值的位向右移动。在这个特定的代码片段的情况下,它似乎是从选定的位图数组元素中提取颜色信息的每个字节到单独的颜色字节中。

http://msdn.microsoft.com/en-us/library/xt18et0d.aspx

假设您的数组包含整数,要将计算值返回到数组元素中,您将反转位移过程并将结果重新组合在一起,如下所示:

int current = (alpha << 24) | (red << 16) | (green << 8) | blue; 
于 2010-08-15T00:26:44.240 回答
2

<<进一步罗伯特的回答 - 并涵盖你的问题的第二部分 - 您可以使用(左移)|(按位或)运算符将单独的组件组合回整数:

int combined = (alpha << 24) | (red << 16) | (green << 8) | blue;
于 2010-08-15T00:38:58.980 回答