Convertir color hexadecimal a valores RGB en PHP


82

¿Cuál sería una buena manera de convertir valores de color hexadecimales como #ffffffen valores RGB únicos 255 255 255usando PHP?


¿Esos dos hexágonos son del mismo tipo? Primero representando al blanco, el segundo al negro ... ¿qué estás tratando de hacer?
BenOfTheNorth

$output = sprintf('%06x', 0xffffff - hexdec(ltrim($input, '#'));sin embargo, es probable que esté demasiado simplificado y probablemente desee analizar los componentes RGB por separado, explique exactamente qué es lo que desea hacer.
DaveRandom

Su ejemplo de representación de destino (a) no forma ninguna representación de un color que he visto y (b) no cumple con su requisito "sin el #".
Quentin

#ffffffy #00000representa blanco y negro respectivamente. Y para la información de año #00000también es un Hex, no un Entero. Aquí festá representando 15.
Ravi

¿Qué quieres decir con convertir y usar solo un número entero ?
Sverri M. Olsen

Respuestas:


56

Consulte las funciones hexdec()y PHP dechex(): http://php.net/manual/en/function.hexdec.php

Ejemplo:

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

7
Para usar esta respuesta para hacer una conversión completa de un valor hexadecimal dado a rgb, una opción es la siguiente: $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

289

Si desea convertir hexadecimal a rgb, puede usar sscanf :

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

Salida:

#ff9900 -> 255 153 0

¿Hay algo para que pueda tener la conversión como hice en mi pregunta? ¿Puedo tener una salida como # 000000
user123_456

14
Buen enfoque limpio con el sscanf(), lo voy a poner en mi caja de trucos de magia. Desafortunadamente, parece que el OP es demasiado vago para averiguar lo que está haciendo y hacia dónde iba con esta idea.
DaveRandom

10
y para colores taquigráficos ( #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 acaba de escribir una prueba para su frase única. #ccc devolverá 12, 12, 12 en lugar de 204, 204, 204, por lo que si lo revierte a hexadecimal, obtendrá el color # 0c0c0c.
John Linhart

1
# F0F se traduce como # FF00FF, por lo que para la lista de colores abreviados ($ r, $ g, $ b) = sscanf ('#'. Implode ('', array_map ('str_repeat', str_split (str_replace ('#', '', $ hex)), [2,2,2])), "#% 02x% 02x% 02x");
Aconrad

41

Hice una función que también devuelve alfa si se proporciona alfa como segundo parámetro, el código está debajo.

La función

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

Ejemplo de respuestas de función

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
)

Si desea devolver el rgb (a) en formato CSS, simplemente reemplace la return $rgb;línea en la función conreturn implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';


33

Para cualquiera que esté interesado, esta es otra forma muy sencilla de hacerlo. Este ejemplo asume que hay exactamente 6 caracteres y ningún signo de almohadilla precedente.

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

Aquí hay un ejemplo que admite 4 entradas diferentes (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
Use en ltrim($colorName, '#')lugar de $colorNamepara cuidar un # si pudiera estar allí
mikeytown2

Vaya, tu segunda línea de código es increíble ... acepta # o no, y 3 o 6 caracteres. Creo que es el mejor enfoque de todos los ejemplos de código de esta página. Estoy marcando esto para proyectos futuros.
hargobind

14

Puedes usar la función hexdec(hexStr: String) para obtener el valor decimal de una cadena hexadecimal.

Vea a continuación un ejemplo:

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

Esto imprimirá rgb(255, 255, 255)


Solución más fácil de entender y aplicar. ¡Tks!
Diego Somar

5

Mi enfoque para cuidar los colores hexadecimales con o sin hash, valores únicos o valores de pares:

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

Puede probar este sencillo código a continuación.

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

Esto devolverá 123,222,132


4

Convertir código de color HEX a 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);

Salida

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

He encontrado esta referencia desde aquí: convierta Color Hex a RGB y RGB a Hex usando PHP


3

He reunido la respuesta de @ John y el comentario / idea de @ iic en una función que puede manejar tanto los códigos de color hexadecimales habituales como los códigos de color taquigráficos.

Una breve explicación:

Con scanf , leo los valores r, gy b del color hexadecimal como cadenas. No como valores hexadecimales como en la respuesta de @ John. En caso de utilizar códigos de colores abreviados, las cadenas r, gy b deben duplicarse ("f" -> "ff", etc.) antes de convertirlas a decimales.

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

intente esto, convierte sus argumentos (r, g, b) a una cadena de color html hexadecimal #RRGGBB Los argumentos se convierten a números enteros y se recortan al rango 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;
}
?>

oh y al revés

Se puede omitir el carácter # al principio. La función devuelve una matriz de tres enteros en el rango (0..255) o falso cuando no reconoce el formato de color.

<?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
//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]);

0

Esta es la única solución que funcionó para mí. Algunas de las respuestas no fueron lo suficientemente consistentes.

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

Si bien este código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resultaría en más votos a favor. Recuerde que está respondiendo la pregunta a los lectores en el futuro, no solo a la persona que pregunta ahora. Por favor, editar su respuesta para agregar explicaciones y dar una indicación de lo que se aplican limitaciones y supuestos.
Dharman

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

Al responder, es mucho más útil si explica por qué esta es la solución preferida. El objetivo es educar, no simplemente resolver un problema específico.
The Tin Man

0

Mi solución: (admite notación corta)

$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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.