使用索引号作为参考值计算PHP中两种颜色之间的平均颜色

R_K*_*R_K 11 php hex colors

在PHP中,我试图计算不同的十六进制颜色之间的平均颜色(十六进制).但是,我还需要能够提供介于0.0和1.0之间的索引号.

例如:

我有

$color1 = "#ffffff" 
$color2 = "#0066CC"
Run Code Online (Sandbox Code Playgroud)

如果我要写一个函数来获得平均颜色,我会提供0.0作为索引号,该函数需要返回" #ffffff".如果我提供1.0作为索引号,则该函数需要返回" #0066CC".但是,如果我将提供0.2,该功能需要两种颜色间的返回的平均色,但仍接近$color1$color2.如果我提供索引号0.5,我会得到两种颜色的确切平均颜色.

我一直试图完成这几天,但我似乎无法弄明白!任何帮助将非常感谢!

Jon*_*Jon 12

为了讨论的目的,我们假设每种颜色都有一个"值".那么,你想要的就是这么简单:

$index = 0.2;
$val1 = get_value_of_color($color1);
$val2 = get_value_of_color($color2);
$newval = $val1 * $index + $val2 * (1 - $index);
$newcolor = get_color_from_value($newval);
Run Code Online (Sandbox Code Playgroud)

因此,困难的部分是弄清楚每种颜色的"价值"是什么.

您可以使用简单的RGB值,其中每种颜色的"值"是一组三个整数:

function get_value_of_color($color) {
    // assume $color is in the form #xxxxxx
    return array(
        hexdec(substr($color, 1, 2)),
        hexdec(substr($color, 3, 2)),
        hexdec(substr($color, 5, 2)),
    );
}

function get_color_from_value($value) {
    return sprintf('#%02x%02x%02x', $value[0], $value[1], $value[2]);
}
Run Code Online (Sandbox Code Playgroud)

这里需要分别对每个数组元素进行乘法和加法.我认为在这一点上应该很容易使用一个简单易用的功能来自己混合颜色.

如果这不是您所需要的,那么您可以使用HSL值或其他更适合您应用的指标.这个想法将保持不变.