【问题标题】:Hex Code Brightness PHP?十六进制代码亮度PHP?
【发布时间】:2011-03-02 04:51:39
【问题描述】:

我希望我网站上的用户能够选择十六进制颜色,我只想为深色显示白色文本,为浅色显示黑色文本。你能从十六进制代码(最好是 PHP)中计算出亮度吗?

【问题讨论】:

    标签: php colors hex brightness


    【解决方案1】:

    您需要将 RGB 值转换为 HLS/HSL(色调亮度和饱和度),然后您可以使用亮度来确定您需要浅色文本还是深色文本。

    This page 有一些关于如何在 PHP 中进行转换以及从中选择补色的详细信息。

    我刚刚发现该网站是一个占星术网站 - 如果有人冒犯了,敬请见谅。

    【讨论】:

    • 关于占星术网站:是的,这太可怕了!(不,开玩笑的,有趣的是他们的网站上有这样一个与编程相关的主题,我没想到会这样。)
    【解决方案2】:

    如果您激活了 imagemagick 扩展,您可以简单地创建一个 ImagickPixel 对象,使用您的十六进制值调用 setColor,然后调用 getHSL()(并获取我想获得的数组的最后一项)...

    【讨论】:

      【解决方案3】:
      $hex = "78ff2f"; //Bg color in hex, without any prefixing #!
      
      //break up the color in its RGB components
      $r = hexdec(substr($hex,0,2));
      $g = hexdec(substr($hex,2,2));
      $b = hexdec(substr($hex,4,2));
      
      //do simple weighted avarage
      //
      //(This might be overly simplistic as different colors are perceived
      // differently. That is a green of 128 might be brighter than a red of 128.
      // But as long as it's just about picking a white or black text color...)
      if($r + $g + $b > 382){
          //bright color, use dark font
      }else{
          //dark color, use bright font
      }
      

      【讨论】:

      • 工作完美,甚至不需要进入色相和饱和度! :)
      • 在我的情况下,使用 250 而不是 382 效果更好。我认为全绿色 (#00ff00) 不应该使用浅色字体,而全红色适合深色字体颜色。只是说。
      【解决方案4】:

      我做了一个类似的 - 但基于每种颜色的权重(based on the C# version of this thread)

      function readableColour($bg){
          $r = hexdec(substr($bg,0,2));
          $g = hexdec(substr($bg,2,2));
          $b = hexdec(substr($bg,4,2));
      
          $contrast = sqrt(
              $r * $r * .241 +
              $g * $g * .691 +
              $b * $b * .068
          );
      
          if($contrast > 130){
              return '000000';
          }else{
              return 'FFFFFF';
          }
      }
      
      echo readableColour('000000'); // Output - FFFFFF
      

      编辑: 小优化: Sqrt 被称为昂贵的数学运算,在大多数情况下可能可以忽略不计,但无论如何,通过这样做可以避免它。

      function readableColour($bg){
          $r = hexdec(substr($bg,0,2));
          $g = hexdec(substr($bg,2,2));
          $b = hexdec(substr($bg,4,2));
      
          $squared_contrast = (
              $r * $r * .299 +
              $g * $g * .587 +
              $b * $b * .114
          );
      
          if($squared_contrast > pow(130, 2)){
              return '000000';
          }else{
              return 'FFFFFF';
          }
      }
      
      echo readableColour('000000'); // Output - FFFFFF
      

      它根本不应用 sqrt,而是将所需的截止对比度提高 2,这是一个更便宜的计算

      【讨论】:

      • 这太棒了!谢谢!
      • 要在 dec 中获取 R G B 值,只需使用以下行:list($r, $g, $b) = sscanf($color, "%02x%02x%02x"); 或者如果 $color 以 # list($r, $g, $b) = sscanf($color, "#%02x%02x%02x"); 开头
      【解决方案5】:

      我知道这是一个非常古老的话题,但是对于来自“Google 搜索”的用户来说,这个链接可能就是他们正在寻找的内容。我已经搜索过类似的内容,我认为将其发布在这里是个好主意:

      https://github.com/mexitek/phpColors

      use Mexitek\PHPColors\Color;
      // Initialize my color
      $myBlue = new Color("#336699");
      
      echo $myBlue->isLight(); // false
      echo $myBlue->isDark(); // true
      

      就是这样。

      【讨论】:

        【解决方案6】:

        我尝试了一种不同的方法,我使用 HSL(色调、饱和度和亮度)亮度百分比来检查颜色是深还是浅。 (就像@chrisf 在他的回答中所说)

        功能:

        function colorislight($hex) {
           $hex       = str_replace('#', '', $hex);
           $r         = (hexdec(substr($hex, 0, 2)) / 255);
           $g         = (hexdec(substr($hex, 2, 2)) / 255);
           $b         = (hexdec(substr($hex, 4, 2)) / 255);
           $lightness = round((((max($r, $g, $b) + min($r, $g, $b)) / 2) * 100));
           return ($lightness >= 50 ? true : false);
        }
        

        在返回线上,它检查亮度百分比是否高于 50% 并返回 true,否则返回 false。如果颜色的亮度为 30%,您可以轻松地将其更改为返回 true,依此类推。 $lightness 变量可以从 0 到 100 返回 0 表示最暗,100 表示最亮。

        如何使用该功能:

        $color = '#111111';
        if ( colorislight($color) ) {
           echo 'this color is light';
        }
        else {
           echo 'this color is dark';
        }
        

        【讨论】:

          猜你喜欢
          • 2011-06-10
          • 2019-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-29
          • 2014-01-15
          • 2018-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多