我最近遇到过这段代码,我无法理解它。有人可以解释一下那里发生了什么吗?
union Color32
{
struct ARGB
{
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t a;
} parts;
uint32_t argb;
Color32() : argb(0) {}
Color32(uint32_t c_argb) : argb(c_argb) {}
Color32(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
{
parts.a=a;
parts.r=r;
parts.g=g;
parts.b=b;
}
};
答案 0 :(得分:4)
union
共享存储的成员。这与struct
形成对比,其中每个成员都分配了不同的存储空间。
此代码的效果是成员b
,g
,r
& a
结构共享存储ARGB
与argb
Color32
的其他成员union
存储。
因此,设置argb
值的构造函数会隐式设置b
,g
,r
&的值。 a
作为argb
。
相反b
,g
,r
& a
构造函数构建argb
。
这里的“ARGB”下的图表是一个非常好的图片,说明这些部分是如何“打包”成32位块的。
http://en.wikipedia.org/wiki/RGBA_color_space
我可能不需要解释b
代表蓝色,g
绿色,r
代表红色,a
代表alpha代码(AKA透明度)!
如果需要big-endian / little-endian可移植性,则可能会遇到困难。
答案 1 :(得分:0)
ARGB是一个4 uints的结构,代表绿色,蓝色,红色,我不知道。 结构是使用名称部分创建的,因此当您必须使用它时,您必须采取以下行动:parts.r = 20或parts.g = 50.
然后它创建一个对象颜色,它可以包含argb的4个参数(4 * 8 = 32)。
它用你给他的4个参数初始化了对象颜色32:a,b,c,d
Color32(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
{
parts.a=a;
parts.r=r;
parts.g=g;
parts.b=b;
}
要恢复,您有一个名为Color of 32 bits的对象,其中包含4个来自结构部分的8位对象。