如何在c语言中给蒙版上色

如何在c语言中给蒙版上色,c,colors,mask,C,Colors,Mask,如何对红色、绿色和蓝色值的32位无符号整数进行颜色掩码 是这样吗? (彩色蒙版>>8)这会让你得到你想要的结果: short red = (color >> 16) & 0xFF; short green = (color >> 8) & 0xFF; short blue = (color) & 0xFF; “这取决于”,即取决于哪个位是哪个颜色 通常它们是“向后”映射的,因此红色在最低位,绿色在“中间”,蓝色在顶部(如果使用alpha,有时紧跟

如何对红色、绿色和蓝色值的32位无符号整数进行颜色掩码

是这样吗?
(彩色蒙版>>8)

这会让你得到你想要的结果:

short red = (color >> 16) & 0xFF;
short green = (color >> 8) & 0xFF;
short blue = (color) & 0xFF;
“这取决于”,即取决于哪个位是哪个颜色

通常它们是“向后”映射的,因此红色在最低位,绿色在“中间”,蓝色在顶部(如果使用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;

请注意,我在掩码之前移位,这很好,因为它使形成掩码的常数更小,这可能更有效。

这取决于格式。如果您只想保留红色,并且颜色存储为半字节RGBA
RRGGBBAA
,则
color&0xFF000000
将屏蔽所有其他颜色。如果您想知道同一格式的红色值,
(color>>24)&0xFF
将获得该值。

如果您在之后强制转换为char或uint8\t,它会像您所说的那样工作

否则,您还需要添加一个
&0xff
,否则您也将拥有剩余的位(除了最重要的颜色之外)。因此,类似于
(颜色>>8的倍数)&0xff


重要细节:有RGBA和BGRA组件顺序,不同CPU上有不同的端号。你必须知道哪一个是正确的(例如,Windows GDI是BGRA)。

+1,尽管我发现移动常量更清晰(而且速度非常非常小)。为什么移动常量更快?我只是在回答中说了相反的话…@Santiago Lezica:对不起,这对我来说没有任何意义。您仍然需要在运行时进行移位,区别在于是写入(rgba&0xff0000)>>16还是写入(rgba>>16)&0xff。它总是按位的,并且有一个恒定的右参数,在后一种情况下,它只是更小,这可能会占用更少的指令编码空间。@Santiago Lezica:在这种情况下,“var&(const>>16)”代码完全没有意义。不,你是对的,没有移动常量。正如您在下面所说的,它不会将值保留在较低的字节中。您所说的颜色掩码是什么意思?根据上下文的不同,该术语可以有几种有效的含义。你可以提供一个链接到一个缩小范围的页面,或者描述你想要的内容。@Santiago Lezica:正如我在另一个答案中所评论的,我根本不相信你。也许你应该发表自己的答案,说明你建议的技巧。@Santiago Lezica:我不是在“咆哮”。)我只是担心这个网站的答案质量,也很感兴趣,因为我花了很长时间思考这个屏蔽代码,而你似乎知道一些我不知道的事情。然而,我相信你错了。您建议的代码green=agbr&(0xff)看,您是对的,它不是。我想的是位掩码,而不是值。让我们删除前面的注释,大多数人不会阅读这本注释圣经来决定。