Php 给定背景色,黑色还是白色文本?
我正试图找到一种方法,在给定背景色(作为十六进制值)的情况下,确定是否使用黑色或白色文本。以前有人处理过这个问题吗?有没有一个有效的方法来做到这一点Php 给定背景色,黑色还是白色文本?,php,css,colors,hex,Php,Css,Colors,Hex,我正试图找到一种方法,在给定背景色(作为十六进制值)的情况下,确定是否使用黑色或白色文本。以前有人处理过这个问题吗?有没有一个有效的方法来做到这一点 在我的例子中,我将使用PHP来实现逻辑(尽管欢迎您在其他语言中使用PHP)。一个简单但并不完美的解决方案是将各个组件(RGB)相加,该值越大,则“颜色越浅”。因此,对于高值,可以使用黑色作为前景,对于低值,可以使用白色 然后,您可以改进此方法,为灰度颜色(R=G=B)创建特定的案例,这些颜色除了非常深的灰色外,不会很好地显示白色文本 编辑:这当然意
在我的例子中,我将使用PHP来实现逻辑(尽管欢迎您在其他语言中使用PHP)。一个简单但并不完美的解决方案是将各个组件(RGB)相加,该值越大,则“颜色越浅”。因此,对于高值,可以使用黑色作为前景,对于低值,可以使用白色 然后,您可以改进此方法,为灰度颜色(R=G=B)创建特定的案例,这些颜色除了非常深的灰色外,不会很好地显示白色文本
编辑:这当然意味着您需要知道以十六进制值表示的RGB存储格式,标准24bpp存储是0x00RRGGBB,用于8个十六进制数字。请查看此页面:
请记住,如果黑色和白色是您唯一的选择,那么您肯定会遇到两种颜色都不是特别好的情况。我会计算rgb组件的平均值,然后决定是否使用黑色或白色,例如,白色至0x66以下是一种算法,可用于计算文本的亮度对比度: 您可以将此公式与白色和黑色值一起使用,以计算出更高的比率,从而使文本更具可读性。您应该看看。它是用PHP实现的,为您完成了所有艰苦的工作。
函数getTextColour($hex){
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;
}
列表($red、$green、$blue)=sscanf($hex,#%02x%02x%02x”);
$luma=($red+$green+$blue)/3;
如果($luma<128){
$textcolour=“白色”;
}否则{
$textcolour=“黑色”;
}
返回$textcolour;
}
亮度对比度算法
我认为最好的方法是亮度对比度
算法:
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算法(精度较低) 另一种最简单且不太精确的方法称为
YIQ
(因为它将RGB颜色空间转换为):
+1计算颜色的亮度或亮度远优于平均RGB值#FF0000是明亮的红色,而不是85的平均值会让你相信的深色。在HSB系统中(B为0-100%刻度),亮红色为B=100。在实验室系统中,你只得到54,可能更有用,因为它高于50%,这表明你应该用黑色来代替白色。这是一个压缩版本,如果你能提供
R
/G
/B
值(共255个):函数textColor($R,$G,$B){返回((0.2126*$R/255)+(0.7152*$G/255)+(0.0722*$b/255)>=0.5?“#000”:“#FFF”)}
如果有人在找,我已经将第一个函数改编成Python:@Benbb96干得好
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';
}