基于数字的颜色编码

10

我想根据1到100之间的数字显示红色、黄色和绿色之间的颜色。

数字1为绿色,数字100为红色,数字50为黄色。我想创建一个在这些颜色之间形成渐变的效果。

到目前为止,我尝试过:

$r = floor(255 * ($number / 100));
$g = 255 - $r;

它有一定效果,但给出的是棕色和暗色,没有黄色。


3
可能是重复的问题:在给定区间内生成红色和绿色之间的颜色 - Naftali
4个回答

12

这是因为你不应该同时更改两个通道,而是在前半部分提高R,在后半部分降低G。

尝试使用此类函数:

function GreenYellowRed($number) {
  $number--; // working with 0-99 will be easier

  if ($number < 50) {
    // green to yellow
    $r = floor(255 * ($number / 50));
    $g = 255;

  } else {
    // yellow to red
    $r = 255;
    $g = floor(255 * ((50-$number%50) / 50));
  }
  $b = 0;

  return "$r,$g,$b";
}

测试它:

$output = "";
for ($i = 1; $i <= 100; $i++) {
  $rgb = GreenYellowRed($i);
  $output .= "<div style='background-color: rgb($rgb)'>$rgb</div>";
}
echo $output;

1
通过一些小的调整,这里是一个小测试... http://jsfiddle.net/amackay11/xtb51wed/883/ - amackay11
我花了一段时间才找到这样的解决方案。有了这样的结果。现在要制作一个永久的CSS文件。谢啦! - vr_driver
@Olivier Pons:不确定您为什么在这里发布它,它只是遵循OP的惯例。 - Czechnology

2

2
我不知道是否存在一个数学模型,可以通过指定的RGB颜色值(例如您描述的绿色/黄色/红色)来绘制“颜色曲线”,从而允许您计算该曲线中的任何中间颜色。无论如何,函数模型(这就是它会成为什么)只能像需要拟合的数据点一样好,因此即使有人指出了数学方法,您也必须比绿色/黄色/红色更具体才能获得良好的结果。
请记住,我们在这里不关心数学插值,而是关心“颜色空间插值”(我刚刚编造的术语)——换句话说,对人类来说看起来自然的插值
对于那些没有必要的色彩理论知识的人来说,我建议更简单的解决方案是使用取色器工具预先选择若干个颜色,将0-100范围分成与您选择的颜色相同数量的区段,并使用简单的整数除法从0-100投影到颜色带中。
值得思考的问题:实际上,SO如何确定评论的赞数的颜色? 更新:我刚刚在 Meta 上 提出了 上述问题。让我们看看...

4
SO如何决定对评论的赞数使用什么颜色?神奇! - Czechnology

2

经过一番查找,这些解决方案都不尽人意。如上所述,HSV可能是最好的选择,因为现代浏览器可以很好地渲染颜色。

要了解您正在使用的颜色,请查看此颜色轮:

http://www.colorspire.com/rgb-color-wheel/

我想从蓝色开始,因此我将使用255进行归一化。

function temp_color($temp){

    $start = 40;
    $end = 85;

    $normal = round(255-((($temp - $start)/($end-$start))*255));

    $color = "hsl($normal, 100%, 30%);";
    $span = "<span style=\"color: $color\">$temp</span>";

    return $span;
}   

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