【问题标题】:Given a background color, black or white text?给定背景颜色,黑色或白色文本?
【发布时间】:2010-11-22 19:52:02
【问题描述】:

在给定背景颜色(作为十六进制值)的情况下,我正在尝试寻找一种方法来确定是使用黑色文本还是使用白色文本。以前有没有人处理过这个问题?有没有有效的方法来做到这一点?

在我的例子中,我会使用 PHP 来实现逻辑(尽管任何其他语言的经验都是受欢迎的)。

【问题讨论】:

    标签: php css colors hex


    【解决方案1】:

    一个简单但不完美的解决方案是将各个分量 (RGB) 相加,这个值越大,“颜色越浅”。因此,对于高值,您可以使用黑色作为前景,对于低值,使用白色。

    然后您可以改进此方法,为灰度颜色 (R = G = B) 制作特定情况,除了非常深的灰色外,不能很好地显示白色文本。

    编辑:这当然意味着你需要知道你的十六进制值的RGB存储格式,标准的24bpp存储是8个十六进制数字的0x00RRGGBB。

    【讨论】:

      【解决方案2】:

      看看这个页面:Calculating Color Contrast with PHP

      请记住,如果黑色和白色是您唯一的选择,那么您肯定会遇到两种情况都不是特别好的情况。

      【讨论】:

      • +1 计算颜色的亮度或亮度远远优于平均 RGB 值。 #FF0000 是鲜红色,而不是 85 的平均值会让您相信的深色。在 HSB 系统中(B 为 0-100%),B=100 表示鲜红色。在 Lab 系统中,你只得到 54,可能更有用,因为它高于 50% 点,表明你应该使用黑色来对抗它,而不是白色。
      【解决方案3】:

      我会计算 rgb 分量的平均值,然后决定是使用黑色还是白色,例如白色到 0x66

      【讨论】:

        【解决方案4】:

        这是一种可用于计算文本亮度对比度的算法:

        http://juicystudio.com/services/aertcolourcontrast.php

        您可以将此公式与白色和黑色值一起使用,以计算出哪个比例更高,从而使文本更具可读性。

        【讨论】:

          【解决方案5】:

          你应该看看the CSS Color library。它是用 PHP 实现的,可以为您完成所有艰苦的工作。

          【讨论】:

            【解决方案6】:
              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;
              }
            

            【讨论】:

              【解决方案7】:

              亮度对比算法

              我认为最好的方法是Luminosity Contrast算法

              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色彩空间转换为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';
              }                   
              

              【讨论】:

              • 这是一个压缩版本,如果您可以提供 R/G/B 值(共 255 个):function textColor($r,$g,$b) { return ((0.2126*$r/255)+(0.7152*$g/255)+(0.0722*$b/255)&gt;=0.5?'#000':'#FFF'); }
              • 如果有人在寻找它,我已经将第一个函数改编为 Python:gist.github.com/Benbb96/e7b1ce654f616da08e61fa888e666354
              • @Benbb96 干得好
              猜你喜欢
              • 1970-01-01
              • 2021-12-03
              • 2017-09-04
              • 2017-04-23
              • 2011-01-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多