算法:如何使用RGB值从红色渐变到绿色通过黄色?

73
我想根据0到100的值显示颜色。在一端(100),它是纯红色,在另一端(0),是纯绿色。在中间(50),我想让它变成黄色。
并且我希望颜色逐渐从一个渐变到另一个,如在75处,颜色为一半红色和一半黄色等等。
如何编写RGB值以反映这种渐变?谢谢。

3
WPF?WinForms?你要将渐变应用在哪里? - Alex Aza
18个回答

0
如果你在使用 Python 的话,这可能会有帮助……

def rgb(p):# <-- percentage as parameter
    #Starting with color red
    d = [255,0,0]
    #formula for finding green value by percentage
    d[1] = int((510*p)/100)
    print(d[1])
    #if green value more than 255
    #set green value 255
    #reduce the red value from remaining green value
    if d[1]>255:
        d[0] -= d[1]-255
        d[1] = 255
        
    return d

print(rgb(0))

0
我使用这个函数将 CPU 速度值从 1400 MHz 到 3500 MHz 映射到 rgb() 值,以获得从绿色到黄色再到红色的颜色。
function green_yellow_red(core_MHz, core_id){
  var core_color = ~~core_MHz.map(1400, 3500, 0, 510)

  if(core_color < 255){
    $('#cpu_core_'+core_id).css('background', 'rgb('+core_color+',255 , 0)')
  }else{
    core_color-=255
    $('#cpu_core_'+core_id).css('background', 'rgb(255 ,'+ (255-core_color) +', 0)')
  }
}

0

大同小异。只是用Delphi Pascal编写并简化+锁定为信号灯颜色(红/黄/绿)。

rectangle1.Fill.Color:=DefineColorSemaphore(newcolor);

function TForm1.DefineColorSemaphore(valperc:integer):TAlphaColor;
var
   vcol: TAlphaColorRec;
begin
  vcol.B := 0;    // blue:  always 0
  vcol.A := 255;  // alpha: 255=no
  if (valperc < 50) then
    begin
       // starts @ RGB=255,0,0 and increases G 0->255
       vcol.R := 255;
       vcol.G := trunc(255*valperc/50);
    end
    else
    begin
       // starts @ RGB=255,255,0 and decreases R 255->0
       vcol.R := 255-trunc(255* (valperc - 50)/50);
       vcol.G := 255;
    end;
  result:= TAlphaColor(vcol);
end;

0
今天我有一个类似的需求。输入是从0.0到1.0的百分比,输出为红色到绿色。实现基于jterrace的答案:
Color percentToColor(float percent)
{
    if (percent<0 || percent>1) { return Color.Black; }

    int r, g;
    if (percent<0.5)
    {
        r=255;
        g = (int)(255*percent/0.5);  //closer to 0.5, closer to yellow (255,255,0)
    }
    else
    {
        g=255;
        r = 255 - (int)(255*(percent-0.5)/0.5); //closer to 1.0, closer to green (0,255,0)
    }
    return Color.FromArgb(r, g, 0);
}

0

你只需要创建一个带有整数参数的函数

  • 输入100将返回RGB(100,0,0)
  • 输入50将返回RGB(50,50,0)
  • 输入0将返回RGB(0,100,0)
  • 输入99将返回RGB(99,1,0)
  • 输入98将返回RGB(98,2,0)
  • 输入2将返回RGB(2,98,0)
  • 输入1将返回RGB(1,99,0)

        private Color fader(int v){
           return Color.FromArgb(v, 100-v, 0); 
        }
    

看起来你忘记了 r.g.b 值是最高到 255 而不是 100。 - Rafael Herscovici
这不会真正地渐变得很好看,黄色部分会相当狭窄。 - Giorgio Aresu

0

// 在 WM_DRAWITEM 事件中,用红黄绿渐变填充 OwnerDraw 控件

int cx = lpDis->rcItem.right - lpDis->rcItem.left;

for (int x = 0; x < cx; x++)
{
    COLORREF cr;

    double d = 255 * 2 * (double)x/(double)cx;

    cr = x <= cx/2 ?    RGB(255,     d,   0) :
                        RGB(255 - d, 255, 0);

    HPEN hPen = CreatePen(PS_SOLID, 1, cr);
    HPEN hOldPen = (HPEN)SelectObject(lpDis->hDC, hPen);
    MoveToEx(lpDis->hDC, x, lpDis->rcItem.top, NULL);
    LineTo(lpDis->hDC, x, lpDis->rcItem.bottom);
    SelectObject(lpDis->hDC, hOldPen);
    DeleteObject(hPen);
}

插图


0

最近我打算使用Javascript做一些事情。我遵循了两个步骤。

  1. 首先将值缩放到0-1范围内(scaledValue = (value - min) / (max - min))
  2. 然后,如果值小于或等于0.5,则增加红色通道的值,如果值大于0.5,则减少绿色通道的值

这是我用于此目的的代码。

var blue = 0.0, red = 0.0, green = 0.0;

if(scaledValue <= 0.5)
{
    red = (scaledValue * 2) * 255.0;
    green = 255.0;
    blue = 0;
}else
{
    red = 255.0;
    green = 255.0 + 255.0 - ((scaledValue  * 2)* 255);
    blue = 0;
}

一个展示C++中如何实现的示例代码

这个解决方案受到了@jterrace答案的启发。


0
在Javascript中,根据速度生成相应的颜色。
最大速度 = 红色
最小速度(0)= 绿色
var g = speed / speedMax * 100
        var color = [0, 255, 0];
        color[0] = (510 * g) / 100
        if(color[0] > 255) {
          color[1] = color[1] - (color[0] - 255)
          color[0] = 255
        }

enter image description here

代码是基于AssaultOPS的版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接