给定背景颜色,黑色或白色文本?
问题描述:
我试图找到一种方法来确定是否使用黑色或白色文本,给定背景颜色(作为十六进制值)。有没有人处理过这个?有没有一种有效的方法来做到这一点?给定背景颜色,黑色或白色文本?
在我的情况下,我会使用PHP来实现逻辑(尽管任何在其他语言中的经验都是值得欢迎的)。
答
一个简单但并不完美的解决方案是对各个组件(RGB)进行求和,并将这个值越大'颜色越浅'。因此,对于高价值,您可以使用黑色作为前景,而对于较低的值,可以使用白色。
然后,您可以改进此方法,为灰度色(R = G = B)制作特定情况,除非是深灰色,否则不会很好地显示白色文本。
编辑:当然,这意味着你需要知道的RGB存储在你的十六进制值的格式,标准的24 bpp的存储是0x00RRGGBB为8个十六进制数字。
答
我会计算rgb组件的平均值,然后决定是否使用黑色或白色,例如白高达0x66
答
这里是一个可以用来计算你的文字的亮度对比度的算法:
http://juicystudio.com/services/aertcolourcontrast.php
你可以使用这个公式有白色和黑色的值来计算它给你更高的比例,从而更可读的文字。
答
function getTextColour($hex){
list($red, $green, $blue) = sscanf($hex, "#%02x%02x%02x");
$luma = ($red + $green + $blue)/3;
if ($luma < 128){
$textcolour = "white";
}else{
$textcolour = "black";
}
return $textcolour;
}
答
我认为最好的办法是Luminosity Contrast
算法:
提醒:下一个功能效果很好的大部分时间,但有时也有颜色,它不工作正常。
public function getContrastColor($hexColor) {
//////////// hexColor RGB
$R1 = hexdec(substr($hexColor, 0, 2));
$G1 = hexdec(substr($hexColor, 2, 2));
$B1 = hexdec(substr($hexColor, 4, 2));
//////////// Black RGB
$blackColor = "#000000";
$R2BlackColor = hexdec(substr($blackColor, 0, 2));
$G2BlackColor = hexdec(substr($blackColor, 2, 2));
$B2BlackColor = hexdec(substr($blackColor, 4, 2));
//////////// Calc contrast ratio
$L1 = 0.2126 * pow($R1/255, 2.2) +
0.7152 * pow($G1/255, 2.2) +
0.0722 * pow($B1/255, 2.2);
$L2 = 0.2126 * pow($R2BlackColor/255, 2.2) +
0.7152 * pow($G2BlackColor/255, 2.2) +
0.0722 * pow($B2BlackColor/255, 2.2);
$contrastRatio = 0;
if ($L1 > $L2) {
$contrastRatio = (int)(($L1 + 0.05)/($L2 + 0.05));
} else {
$contrastRatio = (int)(($L2 + 0.05)/($L1 + 0.05));
}
//////////// If contrast is more than 5, return black color
if ($contrastRatio > 5) {
return 'black';
} else { //////////// if not, return white color.
return 'white';
}
}
一些结果:
注:字体颜色是由先前的功能来确定。括号内的数字是对比度。
另一个称为YIQ
(,因为它与RGB颜色空间转换为YIQ)simpliest和不太精确的方式:
public function getContrastColor($hexcolor) {
$r = hexdec(substr($hexcolor, 0, 2));
$g = hexdec(substr($hexcolor, 2, 2));
$b = hexdec(substr($hexcolor, 4, 2));
$yiq = (($r * 299) + ($g * 587) + ($b * 114))/1000;
return ($yiq >= 128) ? 'black' : 'white';
}
1计算亮度或者颜色的亮度远远优于平均RGB值。 #FF0000是鲜红色的,而不是85的平均值会让你相信的深色。在HSB系统中(B为0-100%),对于鲜红色,B = 100。在实验室系统中,只有54个,可能更有用,因为它高于50%,表明你应该使用黑色而不是白色。 – 2009-08-25 23:51:23
这是一个伟大的发现! – Wilco 2009-08-25 23:53:31