>>是什么运营商在C#做什么?

时间:2010-08-15 00:26:02

标签: c# silverlight argb

我对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
 }

什么是“&gt;&gt;”做转换价值?

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

提前致谢。

编辑:谢谢大家,现在有道理。

3 个答案:

答案 0 :(得分:16)

它是二元移位运算符。

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

AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB

所以,将整个事情转移到24个地方,你就会留下alpha通道

AAAAAAAA

移动16,你得到alpha通道和红色通道

AAAAAAAARRRRRRRR

现在,因为它被转换为字节,所以只提取前8位

(byte)AAAAAAAARRRRRRRR == RRRRRRRR

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

AAAAAAAARRRRRRRR &
0000000011111111
----------------
00000000RRRRRRRR

答案 1 :(得分:12)

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

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

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

int current = (alpha << 24) | (red << 16) | (green << 8) | blue; 

答案 2 :(得分:2)

除了Robert的回答 - 并且涵盖问题的第二部分 - 您可以使用<< (left-shift)| (bitwise OR)运算符将单独的组件组合回整数:

int combined = (alpha << 24) | (red << 16) | (green << 8) | blue;