我知道要使用
从rgb获取颜色值b = rgb >> 0
g = rgb >> 8
r = rgb >> 16
有人可以解释为什么会这样吗?每个都是8位对吗?没有>>> n给出前n位?它对b和r的作用如何?
答案 0 :(得分:2)
实际上,除非你在某个时候剥掉不需要的位,否则它不应该起作用。
>>
是右移位运算符,其中零位从左侧进入,向右侧滚动的位被发送到bitbucket(被丢弃)。考虑到24位RGB值具有以下位,每种颜色八个):
rrrrrrrrggggggggbbbbbbbb
右移0位给出相同的值,右移8位给出rrrrrrrrgggggggg
,右移16位给出rrrrrrrr
。
因此,您可以看到三个班次为您提供“低”(最右侧)八位中的三个颜色值。更常规的方法是and
使用255(十六进制为0xff
)来确保除了低八位之外的所有位都清零:
b = (rgb ) & 0xff;
g = (rgb >> 8) & 0xff;
r = (rgb >> 16) & 0xff;
有关按位运算符的更详细说明,请参阅this answer。
答案 1 :(得分:2)
是的,这些是"右转"运算符 - 因此,如果颜色编号以24位编码, 是红色的高8位,绿色的中间8位,蓝色的8位,如上所述可能有效。
例如,橙色编码为0xff8000;
做的:
rgb = 0xff8000;
b = rgb >> 0; // redundant, the ">>" operator shuld not have been used at all
g = rgb >> 8 ; // g contains ff80
r = rgb >> 16 ; //r contains ff
这里可能只对这些运算符起作用的是r,g和b变量被定义为8位无符号整数,其方式是高位(如上面的g)被截断。我不认为这是一个好习惯,因为它取决于具体的 语义和正确的变量类型只能保持8位无符号。以下变量使用按位AND运算符(&)显式过滤掉较高位,以便获得任何大小的r,g和b变量的颜色分量,并且应该是首选,因为它不会导致确切地说是引起你提出这个问题的疑问:
rgb = 0xff8000;
b = rgb & 0xff;
g = (rgb >> 8) & 0xff ; // g contains 80
r = (rgb >> 16) & 0xff ; //r contains ff
答案 2 :(得分:1)
假设rgb为:0xFF55FF,二进制为:
11111111 01010101 11111111
^^^^^^^^ ^^^^^^^^ ^^^^^^^^
r g b -- rgb color parts (or components)
现在您的代码正在做的是通过向右移动来提取每个组件,我假设r,g,b属于unsigned char
类型(否则它将无效):
b = rgb >> 0
这里没有必要移位,rgb vale被隐式地转换为unsigned char,只剩下11111111-b part。
g = rgb >> 8
这里,首先将b部分向右移动以使g部分位于其上,并且再次如上所述01010101二进制部分被分配给g,如果g是一个字节,则在赋值期间它被隐式地铸造(r部分被铸造掉) )并且g被赋予01010101二进制值。
r = rgb >> 16
这里的历史与g
的历史相同答案 3 :(得分:0)
您应该添加以下类型:
int rgb = 0x1234FF;
byte b = rgb >> 0;
byte g = rgb >> 8;
byte r = rgb >> 16;
然后它会变得更清晰一些。 rgb的位移到右边,并且通过分配到第8位以外的所有byte
都会被截断。