在PHP中插入颜色

时间:2014-01-03 11:56:08

标签: php html colors interpolation

我是一名C ++程序员,他最近开始使用PHP,Javascript和HTML深入研究Web开发。目前我遇到的问题应该很简单,但是没有像我预期的那样工作......

function interpolateColor($corA, $corB, $lerp)
{
$redA = $corA & 0xFF0000;
$greenA = $corA & 0x00FF00;
$blueA = $corA & 0x0000FF;
$redB = $corB & 0xFF0000;
$greenB = $corB & 0x00FF00;
$blueB = $corB & 0x0000FF;

$redC = $redA + (($redB - $redA) * $lerp);
$greenC = $greenA + (($greenB - $greenA) * $lerp);
$blueC = $blueA + (($blueB - $blueA) * $lerp);

return $redC | $greenC | $blueC;
}

我一直在尝试使用此功能根据"优先级"的值,使HTML表的行具有不同的颜色。列,从0到10并除以10以形成" lerpAmount" (0-1)变量。

$cor = interpolateColor(0xFF0000, 0x0000FF, $lerpAmount);

<tr bgcolor="<?=$cor?>">

然而,我得到的颜色看起来不像红蓝插值......它开始呈蓝色,然后只有一行是绿色,然后它变成粉红色并插入某种形式的棕色,然后转动又是深蓝色,这让我觉得有些不对劲。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您必须在结果颜色和掩码之间执行按位AND操作:

$redC = $redA + (($redB - $redA) * $lerp) & 0xFF0000;         // Only Red
$greenC = $greenA + (($greenB - $greenA) * $lerp) & 0x00FF00; // Only Green
$blueC = $blueA + (($blueB - $blueA) * $lerp) & 0x0000FF;     // Only Blue

获取RGB的正确值,然后以十六进制返回颜色,您必须使用以下命令转换它:

$result = dechex($redC | $greenC | $blueC);
return str_pad($result, 6, "0", STR_PAD_LEFT);

(str_pad是将前导零添加到返回的颜色)。

答案 1 :(得分:-1)

这里遇到的问题是下溢问题。我认为。我不知道这是否是正确的词XD

反正!

假设您试图获得的颜色恰好是红色和黑色之间的50%。

所以你要插补0xFF0000和0x000000。你会期望得到0x800000或0x7F0000,对吧?

但那不是你得到的。相反,你会得到0x7F8000,这是一种暗黄色。

就个人而言,我会做这样的事情:

$rgbA = array(
    ($corA & 0xFF0000) >> 16,
    ($corA & 0x00FF00) >> 8,
    ($corA & 0x0000FF)
);
$rgbB = array(
    ($corB & 0xFF0000) >> 16,
    ($corB & 0x00FF00) >> 8,
    ($corB & 0x0000FF)
);
$rgbC = array_map(
    function($a,$b) use ($lerp) {return round($a+($b-$a)*$lerp);},
    $rgbA, $rgbB
);
// if you want a number:
return $rgbC[0]<<16 | $rgbC[1]<<8 | $rgbC[2];
// if you want an HTML hex code:
return sprintf("#%02X%02X%02X",$rgbC[0],$rgbC[1],$rgbC[2]);