我需要一些数学算法来将值从#FF0000转换为#00FF00。
我不想通过黑色值。转换应从红色变为青色(浅蓝色),然后变为绿色。如果只需要从FF0000到000000再到00FF00,那将非常容易。
目标是让级别从0到1000,其中0是#FF0000,1000是#00FF00。 我只需要一些智能映射。
答案 0 :(得分:3)
从评论中,我知道你希望能够显示红色和绿色之间的颜色,并且你不想“经历黑色”,我理解为“我想保持相同的强度”。
为此,您需要更改颜色空间。而不是RGB移动到HSL。取红色的HSL值,然后取绿色的HSL值,并在HSL空间中插值。
将所有中间值转换回RGB,并且您的红色到绿色范围。
答案 1 :(得分:3)
对于一般解决方案,Bart建议使用HSV空间是好的。 Pooya和Emilio的答案将在RGB空间中插入红色和绿色之间,在中间会产生深黄色/橄榄色。
如果您只需要红色和绿色之间的渐变,我建议采用以下快速解决方案:在上半部分中插入红色和黄色(#FFFF00
),在下半部分插入黄色和绿色之间:
unsigned int red_green_interpol(double x)
{
if (x <= 0.0) return 0xFF0000;
if (x >= 1.0) return 0x00FF00;
if (x < 0.5) {
unsigned int g = 510 * x;
return 0xFF0000 | g << 8;
} else {
unsigned int r = 510 * (1.0 - x);
return 0x00FF00 | r << 16;
}
}
我在0.0和1.0之间使用了一个双倍而不是从0到1000的整数范围,但是应该不难调整它。
答案 2 :(得分:0)
可能是这样的:
c:
void print_color ( int value )
{
int r=(255*value)/1000;
printf("#%02x%02x00",r,255-r)
}
代表所有三种颜色:
C:
void print_color ( int value )
{
int curr=(3*value)/1000;
int color[3];
color[curr%3]=(255* (value-curr*(1000/3)))/(1000/3);
color[(curr+1)%3]=255-color[curr];
color[(curr+2)%3]=0;
printf("#%02x%02x%02x",color[0],color[1],color[2]);
}
(可以为RGB订单更改索引......)
答案 3 :(得分:0)
已经回答了,但你想要一些简单的事情:
void gradient()
{
const int _a=3; // color components order
const int _r=2;
const int _g=1;
const int _b=0;
union _col // color
{
DWORD dd; // unsigned 32bit int (your color)
BYTE db[4]; // 4 x BYTE
} col;
col.db[_r]=255; // start color 0x00FF0000
col.db[_g]= 0;
col.db[_b]= 0;
col.db[_a]= 0;
for (int i=0;i<255;i++) // gradient cycle (color 'intensity' = 255)
{
col.db[_r]--;
col.db[_g]++;
// here use your color col.dd;
}
}
对于水平情况,在这种情况下只有255个级别,所以删除并添加它(level = i 0..255):
col.db[_r]=255-i;
col.db[_g]= i;
col.db[_b]= 0;
col.db[_a]= 0;