我是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;
}

我一直在尝试使用这个函数根据“Priority”列的值使HTML表的行具有不同的颜色,该列的值从0到10,除以10形成“lerpAmount”(0-1)变量。
$cor = interpolateColor(0xFF0000, 0x0000FF, $lerpAmount);

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

但是我得到的颜色看起来不像是红蓝色的插值。。。它开始是蓝色的,然后只有一行是绿色的,然后它变为粉红色,再加上某种形式的棕色,然后再变成深蓝色,这让我觉得有些事情很不对劲。
提前谢谢。

最佳答案

必须在结果颜色和遮罩之间执行按位“与”操作:

$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将前导零添加到返回的颜色)。

09-20 23:45