颜色值是表示。数字颜色以及十六进制颜色。“非灰度”颜色包含至少 2 个不同的信息:红色值、绿色值或蓝色值可能不同。对其表示执行操作会给出错误的结果。然后必须对每条信息执行“映射”。您需要提取红色、绿色和蓝色值,分别执行映射,然后构建结果颜色的表示。这是一个使用“最小颜色”的快速助手" 和 "max color",根据您需要使用的 "n" 值对红色、绿色和蓝色值进行映射,然后以十六进制字符串返回结果颜色。它也适用于任何颜色或灰度颜色.
function linear_color($from, $to, $ratio) {
// normalize ralio
$ratio = $ratio<0?0:($ratio>1?1:$ratio);
// unsure colors are numeric values
if(!is_numeric($from))$from=hexdec($from);
if(!is_numeric($to))$to=hexdec($to);
$rf = 0xFF & ($from >> 0x10);
$gf = 0xFF & ($from >> 0x8);
$bf = 0xFF & $from;
$rt = 0xFF & ($to >> 0x10);
$gt = 0xFF & ($to >> 0x8);
$bt = 0xFF & $to;
return str_pad( dechex(($bf + (($bt-$bf)*$ratio)) + ($gf + (($gt-$gf)*$ratio) << 0x8) + ($rf + (($rt-$rf)*$ratio) << 0x10)), 6,'0',STR_PAD_LEFT);
}
只需将 2 种颜色指定为数值或十六进制字符串(不带哈希!),如下所示:
$color_from = hexdec('c2c2c2');
$color_to = hexdec('1eb02b');
for($i=-0.2; $i<=1.3; $i+=0.04){
echo '<div style="background-color: #';
echo linear_color($color_from, $color_to, $i);
echo '">';
echo 'Result color when n = <strong>'.$i.'</strong>';
echo '</div>';
}