【问题标题】:Convert hex color to RGB values in PHP在 PHP 中将十六进制颜色转换为 RGB 值
【发布时间】:2013-02-18 13:43:31
【问题描述】:

使用 PHP 将 #ffffff 等十六进制颜色值转换为单个 RGB 值 255 255 255 的好方法是什么?

【问题讨论】:

  • 这两个十六进制是同一类型的吗?第一个代表白色,第二个代表黑色......你想做什么?
  • $output = sprintf('%06x', 0xffffff - hexdec(ltrim($input, '#')); 但是这可能过于简化了,您可能希望单独分析 RGB 分量,请准确说明您想要做什么。
  • 您的目标表示示例 (a) 没有形成我见过的颜色的任何表示,并且 (b) 不符合您的“没有 #”要求。
  • #ffffff#00000 分别代表白色和黑色。对于您的信息,#00000 也是十六进制而不是整数。这里f 代表 15。
  • 转换只使用整数是什么意思?

标签: php colors hex rgb


【解决方案1】:

如果要将十六进制转换为 rgb,可以使用 sscanf:

<?php
$hex = "#ff9900";
list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x");
echo "$hex -> $r $g $b";
?>

输出:

#ff9900 -> 255 153 0

【讨论】:

  • 有什么可以像我在问题中提出的那样进行转换吗?我可以输出像#000000
  • sscanf() 的简洁方法很好,我正在把它放在我的魔术盒子里。
  • 对于速记颜色 (#ccc):(strlen($hex) === 4) ? list($r, $g, $b) = sscanf($hex, "#%1x%1x%1x") : list($r, $g, $b) = sscanf($hex, "#%2x%2x%2x");
  • @iiic 只是为你的单线写一个测试。 #ccc 将返回 12、12、12 而不是 204、204、204,因此如果您将其恢复为十六进制,您将获得颜色 #0c0c0c。
  • #F0F 转换为 #FF00FF 所以对于速记颜色 list($r,$g,$b) = sscanf('#'.implode('',array_map('str_repeat',str_split(str_replace ('#','',$hex)), [2,2,2])), "#%02x%02x%02x");
【解决方案2】:

查看 PHP 的 hexdec()dechex() 函数: http://php.net/manual/en/function.hexdec.php

例子:

$value = hexdec('ff'); // $value = 255

【讨论】:

  • 要使用此答案将给定的十六进制值完全转换为 rgb,一个选项如下:$split_hex_color = str_split( $hex_color, 2 ); $rgb1 = hexdec( $split_hex_color[0] ); $rgb2 = hexdec( $split_hex_color[1] ); $rgb3 = hexdec( $split_hex_color[2] );
  • 要考虑3或6个十六进制值输入,您可以$split_hex_color = str_split($hex_color, str_len($hex_color / 3));
【解决方案3】:

我创建了一个函数,如果 alpha 作为第二个参数提供,则该函数也返回 alpha,代码如下。

函数

function hexToRgb($hex, $alpha = false) {
   $hex      = str_replace('#', '', $hex);
   $length   = strlen($hex);
   $rgb['r'] = hexdec($length == 6 ? substr($hex, 0, 2) : ($length == 3 ? str_repeat(substr($hex, 0, 1), 2) : 0));
   $rgb['g'] = hexdec($length == 6 ? substr($hex, 2, 2) : ($length == 3 ? str_repeat(substr($hex, 1, 1), 2) : 0));
   $rgb['b'] = hexdec($length == 6 ? substr($hex, 4, 2) : ($length == 3 ? str_repeat(substr($hex, 2, 1), 2) : 0));
   if ( $alpha ) {
      $rgb['a'] = $alpha;
   }
   return $rgb;
}

函数响应示例

print_r(hexToRgb('#19b698'));
Array (
   [r] => 25
   [g] => 182
   [b] => 152
)

print_r(hexToRgb('19b698'));
Array (
   [r] => 25
   [g] => 182
   [b] => 152
)

print_r(hexToRgb('#19b698', 1));
Array (
   [r] => 25
   [g] => 182
   [b] => 152
   [a] => 1
)

print_r(hexToRgb('#fff'));
Array (
   [r] => 255
   [g] => 255
   [b] => 255
)

如果您想以 CSS 格式返回 rgb(a),只需将函数中的 return $rgb; 行替换为 return implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';

【讨论】:

    【解决方案4】:

    对于任何感兴趣的人来说,这是另一种非常简单的方法。此示例假定正好有 6 个字符且前面没有井号。

    list($r, $g, $b) = array_map('hexdec', str_split($colorName, 2));
    

    这是一个支持 4 种不同输入(abc、aabbcc、#abc、#aabbcc)的示例:

    list($r, $g, $b) = array_map(
      function ($c) {
        return hexdec(str_pad($c, 2, $c));
      },
      str_split(ltrim($colorName, '#'), strlen($colorName) > 4 ? 2 : 1)
    );
    

    【讨论】:

    • 使用ltrim($colorName, '#') 而不是$colorName 来处理#,如果它可能存在的话
    • 哇,你的第二行代码太棒了……它接受或不接受 #,以及 3 或 6 个字符。我认为这是此页面上任何代码示例的最佳方法。我正在为将来的项目添加书签。
    【解决方案5】:

    您可以使用函数hexdec(hexStr: String) 来获取十六进制字符串的十进制值。

    示例如下:

    $split = str_split("ffffff", 2);
    $r = hexdec($split[0]);
    $g = hexdec($split[1]);
    $b = hexdec($split[2]);
    echo "rgb(" . $r . ", " . $g . ", " . $b . ")";
    

    这将打印rgb(255, 255, 255)

    【讨论】:

    • 更容易理解和应用的解决方案。谢了!
    【解决方案6】:

    您可以试试下面这段简单的代码。

    list($r, $g, $b) = sscanf(#7bde84, "#%02x%02x%02x");
    echo $r . "," . $g . "," . $b;
    

    这将返回 123,222,132

    【讨论】:

      【解决方案7】:

      我处理带或不带散列、单值或成对值的十六进制颜色的方法:

      function hex2rgb ( $hex_color ) {
          $values = str_replace( '#', '', $hex_color );
          switch ( strlen( $values ) ) {
              case 3;
                  list( $r, $g, $b ) = sscanf( $values, "%1s%1s%1s" );
                  return [ hexdec( "$r$r" ), hexdec( "$g$g" ), hexdec( "$b$b" ) ];
              case 6;
                  return array_map( 'hexdec', sscanf( $values, "%2s%2s%2s" ) );
              default:
                  return false;
          }
      }
      // returns array(255,68,204)
      var_dump( hex2rgb( '#ff44cc' ) );
      var_dump( hex2rgb( 'ff44cc' ) );
      var_dump( hex2rgb( '#f4c' ) );
      var_dump( hex2rgb( 'f4c' ) );
      // returns false
      var_dump( hex2rgb( '#f4' ) );
      var_dump( hex2rgb( 'f489' ) );
      

      【讨论】:

        【解决方案8】:

        我写了一个类似这样的简单函数,它支持以#开头的输入值,也可以输入3或6个字符的十六进制代码:

        
        function hex2rgb( $color ) {
        
            if ($color[0] == '#') {
                $color = substr($color, 1);
            }
            list($r, $g, $b) = array_map("hexdec", str_split($color, (strlen( $color ) / 3)));
            return array( 'red' => $r, 'green' => $g, 'blue' => $b );
        }
        

        这将返回一个关联数组,可以通过$color['red']$color['green']$color['blue'] 访问;

        另请参阅 CSS Tricks 中的 here

        【讨论】:

          【解决方案9】:

          我已将@John 的答案和@iic 的评论/想法放在一个函数中,该函数可以同时处理常用的十六进制颜色代码和速记颜色代码。

          简短说明:

          使用scanf,我从十六进制颜色中读取 r、g 和 b 值作为字符串。不像@John的答案那样的十六进制值。在使用速记颜色代码的情况下,r、g 和 b 字符串在转换为小数之前必须加倍(“f”->“ff”等)。

          function hex2rgb($hexColor)
          {
            $shorthand = (strlen($hexColor) == 4);
          
            list($r, $g, $b) = $shorthand? sscanf($hexColor, "#%1s%1s%1s") : sscanf($hexColor, "#%2s%2s%2s");
          
            return [
              "r" => hexdec($shorthand? "$r$r" : $r),
              "g" => hexdec($shorthand? "$g$g" : $g),
              "b" => hexdec($shorthand? "$b$b" : $b)
            ];
          }
          

          【讨论】:

            【解决方案10】:

            将颜色代码 HEX 转换为 RGB

            $color = '#ffffff';
            $hex = str_replace('#','', $color);
            if(strlen($hex) == 3):
               $rgbArray['r'] = hexdec(substr($hex,0,1).substr($hex,0,1));
               $rgbArray['g'] = hexdec(substr($hex,1,1).substr($hex,1,1));
               $rgbArray['b'] = hexdec(substr($hex,2,1).substr($hex,2,1));
            else:
               $rgbArray['r'] = hexdec(substr($hex,0,2));
               $rgbArray['g'] = hexdec(substr($hex,2,2));
               $rgbArray['b'] = hexdec(substr($hex,4,2));
            endif;
            
            print_r($rgbArray);
            

            输出

            Array ( [r] => 255 [g] => 255 [b] => 255 )
            

            我从这里找到了这个参考 - Convert Color Hex to RGB and RGB to Hex using PHP

            【讨论】:

              【解决方案11】:

              借用@jhon 的答案 - 这将以字符串格式返回 rgb,并带有不透明度选项。

              function convert_hex_to_rgba($hex, $opacity = 1){
                  list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x");
                  return sprintf('rgba(%s, %s, %s, %s)', $r, $g, $b, $opacity);
              }
              
              convert_hex_to_rgba($bg_color, 0.9) // rgba(2,2,2,0.9)
              

              【讨论】:

                【解决方案12】:

                试试这个,它将其参数 (r, g, b) 转换为十六进制 html-color 字符串 #RRGGBB 参数转换为整数并修剪到 0..255 范围

                <?php
                function rgb2html($r, $g=-1, $b=-1)
                {
                    if (is_array($r) && sizeof($r) == 3)
                        list($r, $g, $b) = $r;
                
                    $r = intval($r); $g = intval($g);
                    $b = intval($b);
                
                    $r = dechex($r<0?0:($r>255?255:$r));
                    $g = dechex($g<0?0:($g>255?255:$g));
                    $b = dechex($b<0?0:($b>255?255:$b));
                
                    $color = (strlen($r) < 2?'0':'').$r;
                    $color .= (strlen($g) < 2?'0':'').$g;
                    $color .= (strlen($b) < 2?'0':'').$b;
                    return '#'.$color;
                }
                ?>
                

                哦,反过来

                #开头的字符可以省略。函数返回范围 (0..255) 内的三个整数的数组,如果无法识别颜色格式,则返回 false。

                <?php
                function html2rgb($color)
                {
                    if ($color[0] == '#')
                        $color = substr($color, 1);
                
                    if (strlen($color) == 6)
                        list($r, $g, $b) = array($color[0].$color[1],
                                                 $color[2].$color[3],
                                                 $color[4].$color[5]);
                    elseif (strlen($color) == 3)
                        list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
                    else
                        return false;
                
                    $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
                
                    return array($r, $g, $b);
                }
                ?>
                

                【讨论】:

                  【解决方案13】:
                  //if u want to convert rgb to hex
                  $color='254,125,1';
                  $rgbarr=explode(",", $color);
                  echo sprintf("#%02x%02x%02x", $rgbarr[0], $rgbarr[1], $rgbarr[2]);
                  

                  【讨论】:

                    【解决方案14】:
                    function RGB($hex = '')
                    {
                        $hex = str_replace('#', '', $hex);
                        if(strlen($hex) > 3) $color = str_split($hex, 2);
                        else $color = str_split($hex);
                        return [hexdec($color[0]), hexdec($color[1]), hexdec($color[2])];
                    }
                    

                    【讨论】:

                    • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
                    【解决方案15】:
                    Enjoy    
                    
                    public static function hexColorToRgba($hex, float $a){
                            if($a < 0.0 || $a > 1.0){
                                $a = 1.0;
                            }
                            for ($i = 1; $i <= 5; $i = $i+2){
                                $rgb[] = hexdec(substr($hex,$i,2));
                            }
                            return"rgba({$rgb[0]},{$rgb[1]},{$rgb[2]},$a)";
                        }
                    

                    【讨论】:

                    • 回答时,如果您解释为什么这是首选解决方案,会更有帮助。目标是教育,而不仅仅是解决特定问题。
                    【解决方案16】:

                    我的解决方案:(支持简写)

                    $color = "#0ab";
                    $colort = trim( $color );
                    if( $colort and is_string( $color ) and preg_match( "~^#?([abcdef0-9]{3}|[abcdef0-9]{6})$~ui", $colort ))
                    {
                        if( preg_match( "~^#?[abcdef0-9]{3}$~ui", $colort ))
                        {
                            $hex = trim( $colort, "#" );
                            list( $hexR, $hexG, $hexB ) = str_split( $hex );
                            $hexR .= $hexR;
                            $hexG .= $hexG;
                            $hexB .= $hexB;
                        }
                        else
                        {
                            $hex = trim( $colort, "#" );
                            list( $hexR, $hexG, $hexB ) = str_split( $hex, 2 );
                        }
                    
                        $colorR = hexdec( $hexR );
                        $colorG = hexdec( $hexG );
                        $colorB = hexdec( $hexB );
                    }
                    
                    // Test
                    echo $colorR ."/" .$colorG ."/" .$colorB;
                    // → 0/170/187
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2012-07-25
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-12-27
                      • 1970-01-01
                      • 2011-04-06
                      • 1970-01-01
                      相关资源
                      最近更新 更多