首先,介绍三种基本的颜色表示方式: RGB, HSV, HSL
RGB:
RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216(256 * 256 * 256)种颜色
HSV:
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S:取值范围为0.0~1.0;
亮度V:取值范围为0.0(黑色)~1.0(白色)。
HSL:
HSL 色彩模式是工业界的一种颜色标准,是通过对色调(H)、饱和度(S)、亮度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,HSL即是代表色调,饱和度,亮度三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
HSL色彩模式使用HSL模型为图像中每一个像素的HSL分量分配一个0~255范围内的强度值。HSL图像只使用三种通道,就可以使它们按照不同的比例混合,在屏幕上重现16777216种颜色。
在 HSL 模式下,每种 HSL 成分都可使用从 0到 255的值。(其中L是从黑(0)到白(255)渐变)
_____________________________________
EGE 提供以下函数对各种颜色进行转换:
color_t EGEAPI rgb2gray(color_t rgb);void EGEAPI rgb2hsl(color_t rgb, float *H, float *S, float *L);
void EGEAPI rgb2hsv(color_t rgb, float *H, float *S, float *V);
color_t EGEAPI hsl2rgb(float H, float S, float L);
color_t EGEAPI hsv2rgb(float H, float S, float V);
EGE的各个函数仅使用RGB / RGBA颜色,在使用HSL或者HSV颜色时,可以使用以上函数进行直接转换。HSL颜色使用案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//高级:更多的颜色表示办法(HSV/HSL) #include <graphics.h> int main() { initgraph(640, 480); //初始化随机数种子 randomize(); for (; ;) { //使用随机色彩,纯度为1.0,亮度为0.5 //第一个参数范围从0 - 360,表示一个角度,这个颜色所在的HSL双头圆锥的方位 //0是红色,120是绿色,240是蓝色,详见pdf文档内的HSL颜色空间的说明 setfillcolor(hsl2rgb(float(randomf() * 360), 1.0f, 0.5f)); bar(100,100, 300, 200); //按一下按键变化一次颜色,ESC退出 if (getch() == 27) break; } closegraph(); return 0; } |
为了更好地表示出颜色的渐进变化,使用HSV 表示方式也是很不错的选择。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <graphics.h> int main() { int n = 0; initgraph(640, 480); //delay_fps 函数设置更新帧率 for(;; delay_fps(60)) { //设置填充颜色为HSV颜色。使用n在0~360之间不停变换 setfillcolor(hsv2rgb(float(++n%=360), 1.0f, 1.0f)); fillellipse(320, 240, 300, 200); } closegraph(); return 0; } |
示例:绘制渐变的霓虹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
//高级:绘画渐变色/霓虹 #include <graphics.h> // alpha 混合计算函数 COLORREF alphasingle(COLORREF a, COLORREF b, COLORREF alpha) { return (a * (0xFF - alpha) + b * alpha) >> 8; } // 颜色alpha混合计算函数 COLORREF alphacol(COLORREF d, COLORREF s, COLORREF alpha) { return (alphasingle(d&0xFF00FF, s&0xFF00FF, alpha) & 0xFF00FF) | (alphasingle(d&0xFF00, s&0xFF00, alpha) >> 8 << 8); } int main() { initgraph(640, 480); int c; //画渐变色 for (c=0; c<256; ++c) { COLORREF a = 0xFF0000, b = 0x0000FF; setcolor(alphacol(a, b, c)); line(0, c, 200, c); } //画霓虹 for (c=0; c<360; ++c) { setcolor(hsl2rgb((float)c, 1.0f, 0.5f)); line(200, c, 400, c); } getch(); closegraph(); return 0; } |
近期评论