使用PHP选择合适的背景/前景色

时间:2010-04-12 23:57:33

标签: php colors imagemagick gdlib

我希望找到一个为什么要计算合适的背景颜色和文本的颜色,这显然我需要考虑可读性和可访问性。

我需要从数组中选择两种颜色,颜色存储在十六进制表示中。

#CC9966
#996633
#FFCC99
#CCCC99
#000000
#333333
#666633
#663333
#CC9933
#FFCCCC

我可以使用像GD / imageMagick这样的PHP库吗?

任何建议(请注意我使用的是PHP)

3 个答案:

答案 0 :(得分:2)

首先,我认为你应该在Particletree看看这篇优秀的博客文章。

话虽这么说,我会使用他们的smarty_modifier_contrast()函数并稍微修改它以满足您的特定需求,例如:

function color_contrast($bgcolor, $color1, $color2, $color3, ...)
{
    return (hexdec($bgcolor) > 0xffffff / 2) ? min(array_slice(func_get_args(), 1)) : max(array_slice(func_get_args(), 1));
}

所以你只需要为背景使用任何随机颜色( 不要忘记放弃# )然后传递所有数组的其他颜色,在这种情况下,我使用了可变数量的参数,但你可以改变它,使它接受一个颜色数组 - 然后它会自动选择最暗或最轻的颜色,具体取决于{{1为可读性提供了足够好的对比度:

$bgcolor

要选择function color_contrast($bgcolor, $colors = array()) { return (hexdec($bgcolor) > 0xffffff / 2) ? min($colors) : max($colors); } ,您可以像我之前所说的那样随机执行第二项功能来帮助您完成此任务,例如饱和度亮度 ,这真的取决于你在寻找什么。

答案 1 :(得分:1)

选择随机颜色对于可读性和可访问性通常不是一个好主意,因此我建议您重新考虑您的设计。或者至少将文本限制为仅黑色或白色。

如果那不是一个选项,那么我建议计算两种颜色之间的“距离”,它们大致等于颜色之间的视觉差异,因此也与可读性有些相关。

我会使用distance = abs(2*(r1-r2) + 3*(g1-g2) + (b1-b2)),然后过滤掉任何距离不够的组合。这应该确保您在明亮的背景上最终采用深色,或者在深色背景上采用明亮的颜色,这几乎是良好可读性的先决条件,并确保色盲人员也会看到两种明显不同的色调。颜色分量的权重不同,因为它们对总感知亮度有不同的影响。

答案 2 :(得分:0)

将每种颜色分解为RGB组件,向每个颜色添加0x80(或其他类似值,可能为0x66),掩码为0xff,并在表中找到最接近的值。