如何为红色,绿色和蓝色值掩盖32位无符号整数
这是这样的吗? (color_to_be_masked>> 8)答案 0 :(得分:2)
这可以得到你想要的结果:
short red = (color >> 16) & 0xFF;
short green = (color >> 8) & 0xFF;
short blue = (color) & 0xFF;
答案 1 :(得分:0)
“它取决于”,即哪个位是哪种颜色。
通常它们被“向后”映射,因此Red位于最低位,绿色位于“中间”,蓝色位于顶部(如果使用的话,有时会跟着alpha)。
假设每个组件有8位,你可以:
uint32_t abgr = 0x80eeccaa; /* Or whatever. */
const uint8_t red = abgr & 0xff;
const uint8_t green = (abgr >> 8) & 0xff;
const uint8_t blue = (abgr >> 16) & 0xff;
const uint8_t alpha = (abgr >> 24) & 0xff;
如果您真的使用“rgba”组件订单,请交换以上内容:
uint32_t rgba = 0xaaccee80; /* Or whatever. */
const uint8_t red = (abgr >> 24) & 0xff;
const uint8_t green = (abgr >> 16) & 0xff;
const uint8_t blue = (abgr >> 8) & 0xff;
const uint8_t alpha = abgr & 0xff;
请注意,我在掩码之前移位,这很好,因为它使形成掩码的常量更小,这可能更有效。
答案 2 :(得分:0)
这取决于格式。如果您只想保留红色,并且颜色存储为半字节RGBA RRGGBBAA
,则color & 0xFF000000
将屏蔽掉所有其他颜色。如果您想知道相同格式的红色值,(color >> 24) & 0xFF
将获得它。
答案 3 :(得分:0)
如果你之后施放到char或uint8_t,它的效果就像你说的那样。
否则你需要添加一个&0xff
,否则你也会得到其余的一些(除了最重要的颜色之外)。所以,像(color >> multiple_of_8) &0xff
。
重要细节:有RGBA和BGRA组件排序,不同CPU上有不同的字节序。你必须知道你必须使用哪一个(例如Windows GDI是BGRA)。