如何在php中找到更轻或更暗版本的十六进制代码的十六进制代码

时间:2012-06-18 21:57:05

标签: php jquery html color-codes

我正在努力实现这个人here正在做的事情,只在PHP或jQuery中。基本上我有一个十六进制颜色代码,比如#FF0000,它是红色的。如何找到这种颜色的深色或浅色十六进制颜色代码。

要清除:我想采用十六进制颜色代码(#FF0000),并找到该颜色代码较浅或较深色调的正确十六进制颜色代码。

使用PHP或jQuery完成,我可以通过PHP更改颜色,因为服务器处理页面。

我不想使用第三方jQuery插件来实现这一目标,但如果它超级复杂的话,我会这么做。

3 个答案:

答案 0 :(得分:5)

当您说“较轻版本”(或“较暗版本”)时,存在大量可能性。例如,您可以使用#ff0000并拥有253个“较暗版本”,范围从#010000#fe0000。同样,您可以拥有253个“更轻的版本”,范围从#ff0101#fffefe。所以你的问题定义不明确。

我将在这个答案中假设“较轻的版本”,你的意思是在颜色上涂上50%透明白色的结果,而在颜色上涂上“较暗”的颜色,而不是黑色。

在任何情况下,您都应该始终从十六进制代码中提取数字:

// assuming input of form "#RRGGBB"
$col = Array(
    hexdec(substr($input,1,2)),
    hexdec(substr($input,3,2)),
    hexdec(substr($input,5,2))
);

现在您可以轻松应用“叠加层”:

$darker = Array(
    $col[0]/2,
    $col[1]/2,
    $col[2]/2
);
$lighter = Array(
    255-(255-$col[0])/2,
    255-(255-$col[1])/2,
    255-(255-$col[2])/2
);

然后将它们转换回十六进制代码是一件简单的事情:

$darker = "#".sprintf("%02X%02X%02X", $darker[0], $darker[1], $darker[2]);
$lighter = "#".sprintf("%02X%02X%02X", $lighter[0], $lighter[1], $lighter[2]);

完成!

答案 1 :(得分:5)

我建议使用TinyColor颜色处理微框架。

  

tinycolor.darken( '#FF0000')。toHexString()

答案 2 :(得分:2)

您所要做的就是将十六进制代码拆分为R G和B值,然后在其上运行这部分动作脚本:

factor = percent/100;
r+=(255-r)*factor;
b+=(255-b)*factor;
g+=(255-g)*factor;

所以完整的函数在纯javascript中会是这样的:

function lighten(color,percent){
    factor = percent/100;
    r = parseInt(color.substring(1,2),16);
    b = parseInt(color.substring(3,4),16);
    g = parseInt(color.substring(5,6),16);
    r+=(255-r)*factor;
    r=r.toString(16);
    if(r.length==1)
        r = '0'+r;
    b+=(255-b)*factor;
    b=b.toString(16);
    if(b.length==1)
        b = '0'+b;
    g+=(255-g)*factor;
    g=g.toString(16);
    if(g.length==1)
        g = '0'+g;
    return "#"+r+g+b;
}

function darken(color,percent){
    factor = percent/100;
    r = parseInt(color.substring(1,2),16);
    b = parseInt(color.substring(3,4),16);
    g = parseInt(color.substring(5,6),16);
    r-=(255-r)*factor;
    r=r.toString(16);
    if(r.length==1)
        r = '0'+r;
    b-=(255-b)*factor;
    b=b.toString(16);
    if(b.length==1)
        b = '0'+b;
    g-=(255-g)*factor;
    g=g.toString(16);
    if(g.length==1)
        g = '0'+g;
    return "#"+r+g+b;
}

你可以混合纯javascript和jQuery,所以这应该可以正常工作。