RGB宏的使用

来源:互联网 发布:浙江省数据库三级 编辑:程序博客网 时间:2024/06/05 20:04
       MFC中RGB的宏定义为:(我的教材53页有)
#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。


            图1 RGB内存图
这样,根据内存图,RGB的表示也可以直接采用16进制数表示,如RGB(0,255,128)可以表示为0x80FF。即b分量全色,g分量全色,r分量无色。
可以使用GetRValue,GetGValue、GetBvalue三个宏来获得32位RGB色的分量值。

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

GetRValue直接得到图1的颜色的低字节;




图2 得到r分量
GetGValue将rgb右移8位,再取低字节。




图3 得到g分量
GetBValue将rgb右移16位,再取低字节。




图4 得到b分量
              RGBA是代表r、g、b和 Alpha的色彩空间。Catmull和Smith在1971至1972年间提出了这个不可或缺的alpha数值,使得alpha渲染变得可能。提出者以alpha来命名是源于经典的线性插值方程C=αA +(1-α)B所用的就是这个希腊字母。C的颜色是A和B颜色的线性组合。alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%则意味着一个完全不透明的像素(传统的数字图像)。规范的表示法中,r、g、b和 Alpha用0到1的实数表示,RGB宏使用时乘以255。

阅读下面的程序。
void CTestView::OnDraw(CDC* pDC)
{
           CTestDoc* pDoc = GetDocument();
           ASSERT_VALID(pDoc);
           if (!pDoc)
                   return;
          // TODO: add draw code for native data here
          COLORREF clr=0xFFFFFF;
          BYTE c1=GetRValue(clr);
          CBrush brush;
 #9     brush.CreateSolidBrush(c1<<16);
          pDC->SelectObject(&brush);
          pDC->Rectangle(100,100,500,500);
}

请问矩形用什么颜色填充?为什么呢?
如果#9语句改为
brush.CreateSolidBrush(c1<<7);
会是什么颜色呢?


答案:




//brush.CreateSolidBrush(c1<<7);
等价于
brush.CreateSolidBrush(RGB(128,127,0));
颜色如下图所示。




0 0
原创粉丝点击