如何在c中着色面具

时间:2011-03-30 14:02:59

标签: c colors mask

如何为红色,绿色和蓝色值掩盖32位无符号整数

这是这样的吗?     (color_to_be_masked>> 8)

4 个答案:

答案 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)。