2010-04-12 62 views
5

我期待找到一个为什么要计算合适的背景颜色和文字的颜色,以便通过顶部,显然我需要考虑到可读性和可访问性。使用PHP选择合适的背景/前景颜色

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

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

我可以使用一个PHP库,如GD/imageMagick?

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

回答

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)); 
} 

所以你只需要使用任何颜色随机的背景(别忘了放弃#),然后将所有其他颜色传递给数组,在这种情况下,我使用了可变数量的参数,但是可以更改它以便它接受单个颜色阵列 - 它会自动选择最暗或最亮的颜色,具体取决于$bgcolor并提供可读性好足够的对比度:

function color_contrast($bgcolor, $colors = array()) 
{ 
    return (hexdec($bgcolor) > 0xffffff/2) ? min($colors) : max($colors); 
} 

$bgcolor,你可以随意做它像我使用第二功能,以帮助您完成此任务就像饱和亮度之前说 ,这真的取决于你在找什么。

0

歇每种颜色到它的RGB分量,除以0xFF添加0x80的(或一些其他类似的价值,也许是0x66),以每,面具,并找到最接近的值在桌子里。

+0

你的意思是类似于$ newRed =(($ rgb ['red'] + 0x80)* 0xFF);其中$ rgb ['red']实际上类似于163 – Lizard 2010-04-13 00:29:03

+0

'&0xff'。但是,是的。 – 2010-04-13 00:35:02

1

选择随机颜色通常不是可读性和可访问性的好主意,所以我建议你重新考虑你的设计。或者至少将文本限制为只有黑色或白色。

如果这不是一个选项,那么我会建议计算两种颜色之间的“距离”,这大概等于颜色之间的视觉差异,因此也与可读性有一定关系。我会使用distance = abs(2*(r1-r2) + 3*(g1-g2) + (b1-b2)),然后过滤掉没有足够高距离的任何组合。这可以确保您在明亮的背景下获得深色,或者在深色背景下获得明亮的色彩,这对于提高可读性来说非常重要,并且可以确保色盲人员也能够看到两个截然不同的色调。颜色分量加权不同,因为它们对总体感知亮度有不同的影响。