RGB宏详解

颜色类型变量COLORREF的定义如下:

typedef  DWORD  COLORREF; 可知:COLORREF变量是一个双字,4个字节,32位的值。对应16进制是0x00bbggrr。

补充:1个字节 = 8个二进制位(位);1个字 = 2个字节 = 16位;1个双字 = 2个字 = 4个字节 = 32位


RGB宏颜色处理函数如下(引用别人的:点击打开链接):

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

r、g、b三个颜色分量都是字节型(BYTE)数据,各占8位。其中,r是一个字节,位于第0~7位;g是一个字节,但是左移了8位,右补8个0,称为一个字(WORD),位于第8~15位 ;b是一个字节,但是左移了16位,后面补16个0,成为双字(DWORD),但b位于16~23,如图1所示。双字空出了一个字节,这个字节a常用于颜色融合,也称RGBA。


RGB(r,g,b)其实就是一个双字(DWORD)型,可以直接采用16进制数表示,如RGB(0,255,128)可以表示为0x80FF00。


获取各个颜色分量的宏函数如下:

#define GetRValue(rgb) ((BYTE)(rgb))
#define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
#define GetBValue(rgb) ((BYTE)((rgb)>>16))


其中都用到了(BYTE)进行强制类型转换。在强制类型转换时,规则如下:

  • 如果新类型能够表示原来的值,则结果就是原值。
  • 如果新类型无法表示原来的值,则:
    • 如果新类型是无符号的,则结果是原值不断加上或减去去新类型的最大值,直到它能够被新类型表示。(换而言之是原值 % 2^bb 为新类型的位数)
    • 如果新类型是有符号的,那么结果由实现定义。
例如: unsigned char a = (BYTE)0x1234;   结果a = 0x34。 在这里,0x1234无法被 unsigned char 所表示,而 unsigned char 是无符号的,所以结果是 0x1234 % 2^8 = 0x34。相当于取的是低字节。

由上图可知,GetRValue(rgb)取出来的是r的值;GetGValue(rgb)进行了右移8位,之后取出来的正是g分量的值;GetBValue(rgb)进行了右移16位,之后取出来的正是b分量的值。



猜你喜欢

转载自blog.csdn.net/u012372584/article/details/77878717
RGB