基于数字的颜色编码

时间:2011-04-03 23:42:38

标签: php colors

我希望显示红色,黄色,绿色之间的颜色,具体取决于1到100之间的数字。

1为绿色,100为红色,50为黄色。我想基本上在它之间创建一个渐变。

到目前为止,我试过了:

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

它有点像它,但给了我褐色&深色,&根本没有黄色。

4 个答案:

答案 0 :(得分:11)

这是因为你不应该同时改变两个通道,而是在前半部分升高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 :(得分:2)

我发现处理HSV color modelRGB model更容易。它可以帮助您轻松选择您想要使用的颜色;使用RGB,您需要了解R,G和B的不同值将如何组合以提供您想要/不想要的颜色。

此外,这个SO问题可能有用:How can I cycle through hex color codes in PHP?

答案 2 :(得分:2)

我不知道通过指定RGB颜色值的“颜色曲线”的数学模型(例如,您描述为绿色/黄色/红色),这将允许您计算该曲线中的任何中间颜色。在任何情况下,函数的模型(这将是什么)只是它需要适合的数据点,所以你必须比绿色/黄色/红色更具体,以获得不错的结果即使有人指出数学。

请记住,我们对数学插值不感兴趣,而是在“颜色空间插值”(我刚刚编写的一个术语)中 - 换句话说,会是什么看起来像是对人类的“自然”插值

对于我们这些没有必要的色彩理论知识且我建议使用颜色选择工具预先选择多种颜色的人来说,更简单的解决方案是将0-100范围划分为许多乐队作为你选择的颜色,并使用简单的整数除法从0-100投射到一个色带。

思考的食物:确实,SO如何决定评论的upvote数的颜色?

更新:我只是asked上面的meta。我们看看......

答案 3 :(得分:1)

经过一番观察,没有一个解决方案看起来很讨人喜欢。如上所述,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;
}