Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 给定背景色,黑色还是白色文本?_Php_Css_Colors_Hex - Fatal编程技术网

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