¿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 ?
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 :
¿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.
@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.
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) . ')';
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.
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.
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.
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
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.
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.
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.
$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.#
".#ffffff
y#00000
representa blanco y negro respectivamente. Y para la información de año#00000
también es un Hex, no un Entero. Aquíf
está representando 15.Respuestas:
Consulte las funciones
hexdec()
y PHPdechex()
: http://php.net/manual/en/function.hexdec.phpEjemplo:
$value = hexdec('ff'); // $value = 255
fuente
$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] );
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
fuente
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.#ccc
):(strlen($hex) === 4) ? list($r, $g, $b) = sscanf($hex, "#%1x%1x%1x") : list($r, $g, $b) = sscanf($hex, "#%2x%2x%2x");
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) . ')';
fuente
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) );
fuente
ltrim($colorName, '#')
lugar de$colorName
para cuidar un # si pudiera estar allí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)
fuente
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' ) );
fuente
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
fuente
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
fuente
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) ]; }
fuente
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); } ?>
fuente
//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]);
fuente
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)
fuente
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])]; }
fuente
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)"; }
fuente
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
fuente