我正在尝试找到一种方法,可以确定在给定背景颜色(以十六进制值表示)的情况下,是使用黑色文本还是白色文本。有人处理过这个问题吗?是否有一种有效的方法来解决这个问题?
在我的情况下,我将使用PHP来实现这个逻辑(但任何其他语言的经验都是受欢迎的)。
我认为最好的方法是使用亮度对比度
算法:
function getContrastColor($hexColor)
{
// hexColor RGB
$R1 = hexdec(substr($hexColor, 1, 2));
$G1 = hexdec(substr($hexColor, 3, 2));
$B1 = hexdec(substr($hexColor, 5, 2));
// Black RGB
$blackColor = "#000000";
$R2BlackColor = hexdec(substr($blackColor, 1, 2));
$G2BlackColor = hexdec(substr($blackColor, 3, 2));
$B2BlackColor = hexdec(substr($blackColor, 5, 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 '#000000';
} else {
// if not, return white color.
return '#FFFFFF';
}
}
// Will return '#FFFFFF'
echo getContrastColor('#FF0000');
一些结果:
注意: 字体颜色由前一个函数决定。方括号中的数字是对比度比率。
另一种最简单和不太精确的方法称为YIQ
(因为它将RGB颜色空间转换为YIQ):
public function getContrastColor($hexcolor)
{
$r = hexdec(substr($hexcolor, 1, 2));
$g = hexdec(substr($hexcolor, 3, 2));
$b = hexdec(substr($hexcolor, 5, 2));
$yiq = (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
return ($yiq >= 128) ? 'black' : 'white';
}
请看这个页面: 使用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;
}
R
/G
/B
值(范围在0到255之间),这是一个压缩版本:*function textColor($r,$g,$b) { return ((0.2126*$r/255)+(0.7152*$g/255)+(0.0722*$b/255)>=0.5?'#000':'#FFF'); }
**。 - ashleedawg