第9章 颜色
µC/GUI 支持黑/白,灰度(不同亮度的单色)及彩色显示屏。同一个用户程序可以用于不
同的显示屏,只需要改变 LCD 配置。色彩管理设法为应该显示的任何色彩找到最相近的匹配。
逻辑颜色:在应用中处理的颜色。一种逻辑颜色总是定义为一个 RGB 数值,这是一个 24
位的数值,其中每个基色 8 位,如:0xBBGGRR。因此,白色应该为 0xFFFFFF,黑色应该为
0x000000,大红为 0xFF0000。
物理颜色:显示屏实际显示的颜色。与逻辑颜色一样,同样定义为一个 24 位的 RGB 数值。
在在实际运行的时候,逻辑颜色映射到物理颜色。
对于显示色彩较少的显示屏(例如单色显示屏或 8/16 色 LCD),µC/GUI 通过一个优化版
本的“最小平方偏移搜索”对它们进行转换。它对显示的颜色(逻辑颜色)及 LCD 实际能显
示(物理颜色)的所有有效颜色进行比较,然后使用 LCD 度量认为最接近的颜色。
µC/GUI 中文手册
第 1 页
第 9 章 颜色
9.1 预定义颜色
除自定义颜色之外,在µC/GUI 中预先定义了一些标准的颜色,如下表所示:
定义
颜色
GUI_BLACK
GUI_BLUE
GUI_GREEN
GUI_CYAN
GUI_RED
GUI_MAGENTA
GUI_BROW N
GUI_DARKGRAY
GUI_GRAY
GUI_LIGHTGRAY
GUI_LIGHTBLUE
GUI_LIGHTGREEN
GUI_LIGHTCYAN
GUI_LIGHTRED
黑
蓝
绿
青
红
洋红
褐
深灰
灰
浅灰
淡蓝
淡绿
淡青
淡红
GUI_LIGHTMAGENTA
淡洋红
GUI_YELLOW
GUI_WHITE
黄
白
说明
0x000000
0xFF0000
0x00FF00
0xFFFF00
0x0000FF
0x8B008B
0x2A2AA5
0x404040
0x808080
0xD3D3D3
0xFF8080
0x80FF80
0x80FFFF
0x8080FF
0xFF80FF
0x00FFFF
0xFFFFFF
范例
/* 将背景色设为洋红 */
GUI_SetBkColor(GUI_MAGENTA);
GUI_Clear();
9.2 色彩条测试程序
下面的色彩条程序用于显示如下所示的 13 种颜色条:
黑 -> 红,白 -> 红,黑 -> 绿,白 -> 绿,黑 -> 蓝,白 - > 蓝,黑 -> 白,黑 -> 黄,
白 -> 黄,黑 -> 青,白 ->青,黑 -> 洋红 及 白 -> 洋红。
这个小程序可以以任何颜色格式用于所有显示屏。当然,结果依赖于显示屏能够显示的
颜色。该程序要求一个尺寸为 320*240 的显示屏以显示所有颜色。该程序用于证明对于显示
屏不同颜色设定的效果。它同时也可能用作一个校验显示屏功能的测试程序,检查有效的颜
第 2 页
µC/GUI 中文手册
第 9 章 颜色
色及灰度,同时纠正颜色转换。屏幕截图来自 Windows 仿真器,如果你的设置和硬件是适当
的,它看起来和你的显示屏实际输出正确的吻合。该程序在随µC/GUI 一道提供的范例中的名
字为:COLOR_ShowColorBar.c。
/*--------------------------------------------------------------------------
文件:
COLOR _ShowColorBar.c
目的: 绘制一个色彩条的例子
--------------------------------------------------------------------------*/
#include “GUI.H”
/***************************************************************************
*
绘制 13 种颜色的色彩条
*
***************************************************************************/
void ShowColorBar(void)
{
int x0 = 60, y0 = 40, yStep = 15, i;
int NumColors = LCD_GetDevCap(LCD_DEVCAP_NUMCOLORS);
int xsize = LCD_GetDevCap(LCD_DEVCAP_XSIZE) - x0;
GUI_SetFont(&GUI_Font13HB_1);
GUI_DispStringHCenterAt("µC/GUI-sample:Show color bars", 160, 0);
GUI_SetFont(&GUI_Font8x8);
GUI_SetColor(GUI_WHITE);
GUI_SetBkColor(GUI_BLACK);
#if(LCD_FIXEDPALETTE)
GUI_DispString("Fixed palette: ");
GUI_DispDecMin(LCD_FIXEDPALETTE);
#endif
GUI_DispStringAt("Red", 0, y0 + yStep);
GUI_DispStringAt("Green", 0, y0 + 3 * yStep);
GUI_DispStringAt("Blue", 0, y0 + 5 * yStep);
GUI_DispStringAt("Grey", 0, y0 + 6 * yStep);
GUI_DispStringAt("Yellow", 0, y0 + 8 * yStep);
GUI_DispStringAt("Cyan", 0, y0 + 10 * yStep);
GUI_DispStringAt("Magenta", 0, y0 + 12 * yStep);
for(i=0; i < xsize; i++)
{
µC/GUI 中文手册
第 3 页
第 9 章 颜色
U16 cs =(255 *(U32)i) / xsize;
U16 x = x0 + i; ;
/* 红色 */
GUI_SetColor(cs);
GUI_DrawVLine(x, y0, y0 +yStep - 1);
GUI_SetColor(0xff +(255 - cs) * 0x10100L);
GUI_DrawVLine(x, y0 +yStep, y0 + 2 * yStep - 1);
/* 绿色 */
GUI_SetColor(cs<<8);
GUI_DrawVLine(x, y0 + 2 * yStep, y0 + 3 * yStep - 1);
GUI_SetColor(0xff00 +(255 - cs) * 0x10001L);
GUI_DrawVLine(x, y0 + 3 * yStep, y0 + 4 * yStep - 1);
/* 蓝色 * /
GUI_SetColor(cs * 0x10000L);
GUI_DrawVLine(x, y0 + 4 * yStep, y0 + 5 * yStep - 1);
GUI_SetColor(0xff0000 +(255 - cs) * 0x101L);
GUI_DrawVLine(x, y0 + 5 * yStep, y0 + 6 * yStep - 1);
/* 灰色 */
GUI_SetColor((U32)cs * 0x10101L);
GUI_DrawVLine(x, y0 + 6 * yStep, y0 + 7 * yStep - 1);
/* 黄色 */
GUI_SetColor(cs * 0x101);
GUI_DrawVLine(x, y0 + 7 * yStep, y0 + 8 * yStep - 1);
GUI_SetColor(0xffff +(255 - cs) * 0x10000L);
GUI_DrawVLine(x, y0 + 8 * yStep, y0 + 9 * yStep - 1);
/* 青色 */
GUI_SetColor(cs * 0x10100L);
GUI_DrawVLine(x, y0 + 9 * yStep, y0 + 10 * yStep - 1);
GUI_SetColor(0xffff00 +(255 - cs) * 0x1L);
GUI_DrawVLine(x, y0 + 10 * yStep, y0 + 11 * yStep - 1);
/* 洋红 */
GUI_SetColor(cs * 0x10001);
GUI_DrawVLine(x, y0 + 11 * yStep, y0 + 12 * yStep - 1);
GUI_SetColor(0xff00ff +(255 - cs) * 0x100L);
GUI_DrawVLine(x, y0 + 12 * yStep, y0 + 13 * yStep - 1);
}
第 4 页
µC/GUI 中文手册
第 9 章 颜色
/***************************************************************************
*
主函数
*
***************************************************************************/
void main(void)
{
}
GUI_Init() ;
ShowColorBar();
while(1)
GUI_Delay(100);
9.3 固定的调色板模式
下表列出了有效的固定调色板颜色模式及必须的“#define”(需要在文件 LCDConf.h 中
定义以取得这些模式)。
颜色模式 有效的颜色数
LCD_FIXEDPALETTE
LCD_SWAP_RB
1
2
4
111
222
233
-233
323
-323
332
-332
444
555
-555
565
-565
8666
2 (黑和白)
4 (灰度)
16 (灰度)
8
64
256
256
256
256
256
256
4096
32768
32768
65536
65536
232
详细的描述如下:
1
2
4
111
222
233
233
323
323
332
332
444
555
555
565
565
8666
0
0
0
0
0
0
1
0
1
0
1
0
0
1
0
1
0
µC/GUI 中文手册
第 5 页
第 9 章 颜色
1 模式:1 bpp (黑和白)
该模式必须用于每像素 1 位的单色显示屏。
有效颜色数量:2
2 模式:2 bpp (4 级灰度)
该模式必须用于每像素 2 位的单色显示屏。
有效颜色数量:2×2 = 4.
4 模式:4 bpp(16 级灰度)
该模式必须用于每像素 4 位的单色显示屏。
有效颜色数量:2×2×2×2=16
111 模式:3 bpp (每种基色 2 级)
如果基本的 8 种颜色够用的话可以选择这种
模式。如果你的硬件只支持每像素每基色 1
位,或者你没有足够的视频内存用于更高的色
彩浓度采用这种模式。
有效颜色数量:2×2×2=8
第 6 页
µC/GUI 中文手册
第 9 章 颜色
222 模式:6 bpp (每种基色 4 级)
如果你的硬件没有一个调色板用于每种单独
的颜色,该模式是一种很好的选择。每像素的
每种基色保留 2 位;通常一个像素保存为一个
字节。
有效颜色数量:4×4×4=64
233 模式:2 位蓝色,3 位绿色, 3 位红色
该模式支持 256 种颜色。3 位用于颜色的红色
和绿色部分,2 位用于蓝色部分。如图所示,
结果是绿色和红色为 8 级,而蓝色为 4 级。有
效颜色数量:4×8×8=256
基色顺序:BBGGGRRR
-233 模式:2 位红色,3 位绿色, 3 位蓝色,红蓝互换
该模式支持 256 种颜色。3 位用于颜色的绿色和蓝色部分,2 位用于红色部分。有效的颜色与
332 模式是一样的。结果绿色和蓝色为 8 级,而红色为 4 级。
有效颜色数量:4×8×8=256
基色顺序:RRGGGBBB
323 模式:3 位蓝色,2 位绿色,3 位红色
该模式支持 256 种颜色。3 位用于颜色的红色
和蓝色部分,2 位用于绿色部分。如图所示,
结果是蓝色和红色为 8 级,而绿色为 4 级。
有效颜色数量:8×4×8=256
基色顺序:BBBGGRRR
µC/GUI 中文手册
第 7 页
第 9 章 颜色
111
-323 模式:3 位红色,2 位绿色,3 位蓝色,红蓝互换
该模式支持 256 种颜色。3 位用于颜色的红色和蓝色部分,2 位用于绿色部分。有效的颜色与
323 模式是一样的。结果红色和蓝色为 8 级,而绿色为 4 级。
有效颜色数量:8×4×8=256
基色顺序:RRRGGBBB
332 模式: 3 位蓝色,3 位绿色,2 位红色
该模式支持 256 种颜色。3 位用于颜色的蓝色
和绿色部分,2 位用于红色部分。如图所示,
结果是蓝色和绿色为 8 级,而红色为 4 级。
有效颜色数量: 8×8×4=256
基色顺序:BBBGGGRR
-332 模式:3 位红色,3 位绿色,2 位蓝色,红蓝互换
该模式支持 256 种颜色。3 位用于颜色的红色和绿色部分,2 位用于蓝色部分。有效的颜色与
233 模式是一样的。结果红色和绿色为 8 级,而蓝色为 4 级。
有效颜色数量:8×8×2=256
基色顺序:RRRGGGBB
444 模式:4 位红色,4 位绿色,4 位蓝色
红,绿,蓝每部分平均分配 4 位。
有效颜色数量:16×16×16=4096
基色顺序:BBBBGGGGRRRR
第 8 页
µC/GUI 中文手册