在PHP中将十六进制颜色转换为RGB值


80

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


那两个十六进制是同一类型?第一个代表白色,第二个代表黑色……您要做什么?
BenOfTheNorth

$output = sprintf('%06x', 0xffffff - hexdec(ltrim($input, '#'));但是,这可能过于简化了,您可能要分别分析RGB分量,请确切说明您要执行的操作。
DaveRandom

您的目标表示示例(a)不构成我所见过的颜色的任何表示,并且(b)不满足您的“无#”要求。
昆汀

#ffffff#00000分别代表白色和黑色。对于您来说,信息#00000也是十六进制而不是整数。这f代表
拉维

你是什么意思的转换,并只使用整数
Sverri M. Olsen

Answers:


56

看看PHP的hexdec()dechex()功能: http://php.net/manual/en/function.hexdec.php

例:

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

6
要使用此答案从给定的十六进制值到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] );
thenomadicmann

282

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

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

输出:

#ff9900 -> 255 153 0

有什么可以让我像我在问题中问的那样进行转换吗?我可以输出#000000
2013年

14
不错的干净方法sscanf(),我把那个放在魔术盒子里。不幸的是,OP似乎太懒了,无法确定您在做什么以及该想法的去向。
DaveRandom

9
以及速记颜色(#ccc): (strlen($hex) === 4) ? list($r, $g, $b) = sscanf($hex, "#%1x%1x%1x") : list($r, $g, $b) = sscanf($hex, "#%2x%2x%2x");
iiic

4
@iiic只是为您的单行编写测试。#ccc将返回12、12、12,而不是204、204、204,因此,如果将其还原为十六进制,则会得到颜色#0c0c0c。
约翰·林哈特

1
#F0F转换为#FF00FF,因此对于速记颜色列表($ r,$ g,$ b)= sscanf('#'。implode('',array_map('str_repeat',str_split(str_replace('#','', $ hex)),[2,2,2])),“#%02x%02x%02x”);
aconrad '16

40

我编写了一个函数,如果在下面的代码中提供了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) . ')';


31

对于任何有兴趣的人,这是另一种非常简单的方法。本示例假定正好有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)
);

11
如果可能有#,请使用ltrim($colorName, '#')而不是$colorName照顾它
mikeytown2 2014年

哇,您的第二行代码令人难以置信...它接受#或不接受#,以及3或6个字符。我认为这是此页上所有代码示例的最佳方法。我将其标记为将来的项目。
hargobind '19

14

您可以使用该函数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)


易于理解和应用的解决方案。Tks!
迭戈·索玛

5

我处理十六进制颜色(带有或不带有哈希,单值或成对值)的方法:

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

5

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

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

这将返回123,222,132


4

将颜色代码十六进制转换为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 )

我从这里找到了这个参考-使用PHP将Color Hex转换为RGB并将RGB转换为Hex


3

我将@John的答案和@iic的comment / idea放到一个可以处理通常的十六进制颜色代码和速记颜色代码的函数中。

简短说明:

使用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)
  ];
}

0

尝试此操作,它将其参数(r,g,b)转换为十六进制html颜色字符串#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);
}
?>


0

这是唯一对我有用的解决方案。一些答案不够一致。

    function hex2rgba($color, $opacity = false) {

        $default = 'rgb(0,0,0)';

        //Return default if no color provided
        if(empty($color))
              return $default;

        //Sanitize $color if "#" is provided
            if ($color[0] == '#' ) {
                $color = substr( $color, 1 );
            }

            //Check if color has 6 or 3 characters and get values
            if (strlen($color) == 6) {
                    $hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
            } elseif ( strlen( $color ) == 3 ) {
                    $hex = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
            } else {
                    return $default;
            }

            //Convert hexadec to rgb
            $rgb =  array_map('hexdec', $hex);

            //Check if opacity is set(rgba or rgb)
            if($opacity){
                if(abs($opacity) > 1)
                    $opacity = 1.0;
                $output = 'rgba('.implode(",",$rgb).','.$opacity.')';
            } else {
                $output = 'rgb('.implode(",",$rgb).')';
            }

            //Return rgb(a) color string
            return $output;
    }
    //hex2rgba("#ffaa11",1)

0
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])];
}

尽管这段代码可以解决问题,但包括解释如何以及为什么解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
达曼

0
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)";
    }

回答时,如果您解释为什么这是首选解决方案,则将大有帮助。目标是教育,而不仅仅是解决特定的问题。
铁皮人

0

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

$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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.