COLORREF、COLOR、RGB转化总结分析及在VC++中的使用

作者: admin 分类: C++ 发布时间: 2019-10-12 21:56

真彩色是指显示出来的图像颜色与真实世界中颜色非常自然逼真,使得人眼难以区分它们之间的差别。通常使用RGB图像颜色表示法来表现真彩色图像,即用3字节来表示一个真彩色像素的颜色值。Windows采用该方法来表现颜色,其中SDK提供一个名为RGB的宏来将不同的R、G、B颜色值转化为24位的颜色值。其原型如下:

COLORRER RGB(BYTE bRed,BYTE bGreen,BYTE bBlue);

COLORREF类型用来描绘一个RGB颜色。其在MFC中定义如下:

typedef DWORD COLORREF;

typedef DWORD *LPCOLORREF;

COLORREF 是一个 32-bit 整型数值,它代表了一种颜色。

其初始化方法有两种:

  1. 使用 RGB 函数来初始化 COLORREF。例如:

COLORREF color=RGB(0,255,0);

RGB函数接收三个 0-255 数值,一个代表红色,一个代表绿色,一个代表蓝色。在上面的例子中,红色和蓝色值都为 0,所以在该颜色中没有红色和蓝色。绿色为最大值255。所以该颜色为绿色。0,0,0 为黑色,255,255,255 为白色。

  1. 另一种初始化 COLORREF 的方法如下所示:

CColorDialog colorDialog;

COLORREF color;

if( colorDialog.DoModal() == IDOK )

{

   color = colorDialog.GetColor();

}

如何从COLORREF中获取RGB分量值:

COLORREF colorrrefRGB =RGB(120,250,110);

BYTE r = GetRValue(colorrrefRGB);

BYTE g = GetGValue(colorrrefRGB);

BYTE b = GetBValue(colorrrefRGB);

  1. COLORREF与RGB的相互转化
    RGB(r,g,b)是一个宏,实际上它做得是:

((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

rgb(r,g,b) = 一个整型值 =  r + g * 256 + b255256

COLORREF是一个32-bit整型数值,它代表了一种颜色。你可以使用RGB函数来初始化COLORREF,它的定义:

typedef DWORD   COLORREF;

COLORREF变量有两种赋值方法。

第一种:

COLORREF cf = RGB(,,);

第二种:

CColorDialog colorDialog;

COLORREF color;

if( colorDialog.DoModal() == IDOK )

{

    color = colorDialog.GetColor();

}

第二种方法使用了MFC中的颜色对话框。

如何从 COLORREF中取出RGB分量值?

可以使用宏GetRValue、GetGValue、GetBValue。

他们的定义如下:

define GetRValue(rgb)      ((BYTE)(rgb))

define GetGValue(rgb)      ((BYTE)(((WORD)(rgb)) >> 8))

define GetBValue(rgb)      ((BYTE)((rgb)>>16))

  1. Color与ColorRef(int类型表示的颜色)的相互转换
    实际的软件开发过程中,常需要用到非.net平台的代码。这时候就可能碰到ColorRef(也就是以int类型代表的颜色值或是以DWORD值表示的颜色)。这跟.net平台下的颜色的相互转换MS并没有直接实现。那么就需要我们自己处理了。这里给出两个函数。

代码如下:

uint GetCustomColor(Color color)

{

     int nColor = color.ToArgb();            

     int blue = nColor & 255;            

     int green = nColor >> 8 & 255;            

     int red = nColor >> 16 & 255;            

     return Convert.ToUInt32(blue << 16 | green << 8 | red);        

}

Color GetArgbColor(int color)       

 {            

     int blue = color & 255;            

     int green = color >> 8 & 255;            

     int red = color >> 16 & 255 ;            

     return Color.FromArgb(blue, green, red);        

 } 

注:COLORREF中颜色的排列是BGR,而通过Color.ToArgb()得到的数值中颜色排列是AARRGGBB。

  1. 基于API函数的Colorref和Color之间的转换
    CColorDialog dlg;

if(dlg.DoModal() == IDOK)

{

//m_FillColor = dlg.GetColor();

COLORREF ctmpColor = dlg.GetColor();

Color tmpColor;

tmpColor.SetFromCOLORREF(ctmpColor);

ARGB argb = Color::MakeARGB(m_nFillTran, tmpColor.GetR(),tmpColor.GetG(),tmpColor.GetB());

//Graphics graphics(pDC->m_hDC);

//HatchBrush hBrush(HatchStyleDashedHorizontal,Color(100,255,0,0), Color(argb));

tmpColor = argb;

m_FillColor = tmpColor.ToCOLORREF();

//m_FillColor = RGB(Color(argb));

}

  1. COLORREF 和字符之间的转换
    4.1 格式化字符串

代码如下:

int iRed = GetRValue(pMarkInfo->lfColor);

int iGreen = GetGValue(pMarkInfo->lfColor);

int iBlue = GetBValue(pMarkInfo->lfColor);

CString szColor;

szColor.Format(_T(“#%02X%02X%02X”), iRed, iGreen, iBlue);

/////////////////////////////////////////////////////

CString m_BackColor.m_frame_color = “#0290D8”;

DWORD r,g,b;

sscanf(m_BackColor.m_frame_color,”#%2X%2X%2X”,&r,&g,&b);

COLORREF rgb = RGB(r,g,b);

brush.CreateSolidBrush (rgb)

//////////////////////////////////////////////////

//COLORREF转换为字符串

BOOL CDataManager::GetRGBText(std::string &strRGBText , COLORREF color)

{

 //COLORREF col = RGB( 255 , 12 , 4);

 BYTE Red = GetRValue(color); ///得到红颜色

 BYTE Green = GetGValue(color); ///得到绿颜色

 BYTE Blue = GetBValue(color); ///得到兰颜色

 char chR[4];

 itoa(Red ,chR , 10 );

 char chG[4];

 itoa(Green , chG , 10);

 char chB[4];

 itoa(Blue , chB , 10);

 std::string strR , strG, strB;

 strR = chR ;

 strG = chG;

 strB = chB;

 strRGBText = strR + “,” + strG + “,” + strB;

 return TRUE;

}

//字符串转换为COLORREF,如(”32″,”34″,”21″)

BOOL CDataManager::GetColorRGB(CString strColorText , COLORREF& color)

{

    char chR[4] = “”, chG[4] = “”, chB[4] = “”; 

    sscanf( strColorText, “%[^,],%[^,],%[^,]”, chR, chG, chB);

 color = RGB(atoi(chR), atoi(chG), atoi(chB));

 return TRUE;

}
————————————————
版权声明:本文为CSDN博主「机器视觉001」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liubing8609/article/details/84670918

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

标签云