Diese beiden Felder sind vom gleichen Typ? Das erste repräsentiert Weiß, das zweite Schwarz ... was versuchst du zu tun?
BenOfTheNorth
$output = sprintf('%06x', 0xffffff - hexdec(ltrim($input, '#'));Dies ist jedoch wahrscheinlich zu stark vereinfacht und Sie möchten die RGB-Komponenten wahrscheinlich separat analysieren. Erklären Sie bitte genau, was Sie tun möchten.
Dave Random
Ihr Beispiel für die Zieldarstellung (a) bildet keine Darstellung einer Farbe, die ich gesehen habe, und (b) erfüllt Ihre #Anforderung "ohne " nicht.
Quentin
#ffffffund steht #00000für Weiß bzw. Schwarz. Und für Ihre Informationen #00000ist auch ein Hex keine Ganzzahl. Hier fist 15.
Ravi
Was meinst du mit konvertieren und nur mit einer ganzen Zahl ?
Um diese Antwort zu verwenden, um eine vollständige Konvertierung von einem bestimmten Hex-Wert in $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] );
RGB durchzuführen
287
Wenn Sie hex in rgb konvertieren möchten, können Sie sscanf verwenden :
Gibt es irgendetwas, damit ich eine Konvertierung haben kann, wie ich sie in meiner Frage gestellt habe? Kann ich Ausgabe wie # 000000
user123_456
14
Netter, sauberer Ansatz mit dem sscanf(), ich stecke diesen in meine Schachtel mit Zaubertricks. Leider sieht es so aus, als ob das OP zu faul ist, um herauszufinden, was Sie tun und wohin Sie mit dieser Idee gegangen sind.
@iiic schreibt gerade einen Test für Ihren Einzeiler. #ccc gibt 12, 12, 12 anstelle von 204, 204, 204 zurück. Wenn Sie es also wieder auf hex zurücksetzen, erhalten Sie die Farbe # 0c0c0c.
John Linhart
1
# F0F übersetzt in # FF00FF, also für die Liste der Kurzfarben ($ r, $ g, $ b) = sscanf ('#'. Implode ('', array_map ('str_repeat', str_split (str_replace ('#', '',)) $ hex)), [2,2,2])), "#% 02x% 02x% 02x");
Aconrad
41
Ich habe eine Funktion erstellt, die auch Alpha zurückgibt, wenn Alpha als zweiter Parameter angegeben wird. Der Code befindet sich unten.
Wenn Sie den RGB (a) im CSS-Format zurückgeben möchten, ersetzen Sie einfach die return $rgb;Zeile in der Funktion durchreturn implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';
Für alle Interessierten ist dies eine weitere sehr einfache Möglichkeit. In diesem Beispiel wird davon ausgegangen, dass genau 6 Zeichen und kein vorhergehendes Nummernzeichen vorhanden sind.
Verwenden Sie ltrim($colorName, '#')statt $colorName, um sich um ein # zu kümmern, wenn es dort sein könnte
mikeytown2
Wow, deine 2. Codezeile ist unglaublich ... sie akzeptiert # oder nicht und 3 oder 6 Zeichen. Ich denke, es ist der beste Ansatz aller Codebeispiele auf dieser Seite. Ich setze ein Lesezeichen für zukünftige Projekte.
Hargobind
14
Mit der Funktion können hexdec(hexStr: String)Sie den Dezimalwert einer hexadezimalen Zeichenfolge abrufen.
Ich habe @ Johns Antwort und @ iics Kommentar / Idee zu einer Funktion zusammengefasst, die sowohl die üblichen Hex-Farbcodes als auch die Kurzfarbcodes verarbeiten kann.
Eine kurze Erklärung:
Mit scanf lese ich die r-, g- und b-Werte aus der Hex-Farbe als Zeichenfolgen. Nicht als Hex-Werte wie in @ Johns Antwort. Bei Verwendung von Kurzfarbcodes müssen die Zeichenfolgen r, g und b verdoppelt werden ("f" -> "ff" usw.), bevor sie in Dezimalzahlen konvertiert werden.
Versuchen Sie dies, es konvertiert seine Argumente (r, g, b) in eine hexadezimale HTML-Farbzeichenfolge #RRGGBB Argumente werden in Ganzzahlen konvertiert und auf den Bereich 0..255 gekürzt
Das Zeichen # am Anfang kann weggelassen werden. Die Funktion gibt ein Array mit drei Ganzzahlen im Bereich (0..255) oder false zurück, wenn das Farbformat nicht erkannt wird.
Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
Bei der Beantwortung ist es viel hilfreicher, wenn Sie erklären, warum dies die bevorzugte Lösung ist. Ziel ist es, ein bestimmtes Problem zu erziehen und nicht nur zu lösen.
$output = sprintf('%06x', 0xffffff - hexdec(ltrim($input, '#'));
Dies ist jedoch wahrscheinlich zu stark vereinfacht und Sie möchten die RGB-Komponenten wahrscheinlich separat analysieren. Erklären Sie bitte genau, was Sie tun möchten.#
Anforderung "ohne " nicht.#ffffff
und steht#00000
für Weiß bzw. Schwarz. Und für Ihre Informationen#00000
ist auch ein Hex keine Ganzzahl. Hierf
ist 15.Antworten:
Überprüfen Sie die PHPs
hexdec()
unddechex()
Funktionen: http://php.net/manual/en/function.hexdec.phpBeispiel:
$value = hexdec('ff'); // $value = 255
quelle
$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] );
Wenn Sie hex in rgb konvertieren möchten, können Sie sscanf verwenden :
<?php $hex = "#ff9900"; list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x"); echo "$hex -> $r $g $b"; ?>
Ausgabe:
#ff9900 -> 255 153 0
quelle
sscanf()
, ich stecke diesen in meine Schachtel mit Zaubertricks. Leider sieht es so aus, als ob das OP zu faul ist, um herauszufinden, was Sie tun und wohin Sie mit dieser Idee gegangen sind.#ccc
):(strlen($hex) === 4) ? list($r, $g, $b) = sscanf($hex, "#%1x%1x%1x") : list($r, $g, $b) = sscanf($hex, "#%2x%2x%2x");
Ich habe eine Funktion erstellt, die auch Alpha zurückgibt, wenn Alpha als zweiter Parameter angegeben wird. Der Code befindet sich unten.
Die Funktion
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; }
Beispiel für Funktionsantworten
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 )
Wenn Sie den RGB (a) im CSS-Format zurückgeben möchten, ersetzen Sie einfach die
return $rgb;
Zeile in der Funktion durchreturn implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';
quelle
Für alle Interessierten ist dies eine weitere sehr einfache Möglichkeit. In diesem Beispiel wird davon ausgegangen, dass genau 6 Zeichen und kein vorhergehendes Nummernzeichen vorhanden sind.
list($r, $g, $b) = array_map('hexdec', str_split($colorName, 2));
Hier ist ein Beispiel, das 4 verschiedene Eingaben unterstützt (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) );
quelle
ltrim($colorName, '#')
statt$colorName
, um sich um ein # zu kümmern, wenn es dort sein könnteMit der Funktion können
hexdec(hexStr: String)
Sie den Dezimalwert einer hexadezimalen Zeichenfolge abrufen.Ein Beispiel finden Sie unten:
$split = str_split("ffffff", 2); $r = hexdec($split[0]); $g = hexdec($split[1]); $b = hexdec($split[2]); echo "rgb(" . $r . ", " . $g . ", " . $b . ")";
Dies wird gedruckt
rgb(255, 255, 255)
quelle
Mein Ansatz, sich um Hex-Farben mit oder ohne Hash, Einzelwerte oder Paarwerte zu kümmern:
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' ) );
quelle
Sie können diesen einfachen Code unten ausprobieren.
list($r, $g, $b) = sscanf(#7bde84, "#%02x%02x%02x"); echo $r . "," . $g . "," . $b;
Dies gibt 123.222.132 zurück
quelle
Konvertieren Sie den Farbcode HEX in 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);
Ausgabe
Array ( [r] => 255 [g] => 255 [b] => 255 )
Ich habe diese Referenz von hier aus gefunden - Konvertieren Sie Color Hex in RGB und RGB in Hex mit PHP
quelle
Ich habe @ Johns Antwort und @ iics Kommentar / Idee zu einer Funktion zusammengefasst, die sowohl die üblichen Hex-Farbcodes als auch die Kurzfarbcodes verarbeiten kann.
Eine kurze Erklärung:
Mit scanf lese ich die r-, g- und b-Werte aus der Hex-Farbe als Zeichenfolgen. Nicht als Hex-Werte wie in @ Johns Antwort. Bei Verwendung von Kurzfarbcodes müssen die Zeichenfolgen r, g und b verdoppelt werden ("f" -> "ff" usw.), bevor sie in Dezimalzahlen konvertiert werden.
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) ]; }
quelle
Versuchen Sie dies, es konvertiert seine Argumente (r, g, b) in eine hexadezimale HTML-Farbzeichenfolge #RRGGBB Argumente werden in Ganzzahlen konvertiert und auf den Bereich 0..255 gekürzt
<?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 und umgekehrt
Das Zeichen # am Anfang kann weggelassen werden. Die Funktion gibt ein Array mit drei Ganzzahlen im Bereich (0..255) oder false zurück, wenn das Farbformat nicht erkannt wird.
<?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); } ?>
quelle
//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]);
quelle
Dies ist die einzige Lösung, die für mich funktioniert hat. Einige der Antworten waren nicht konsistent genug.
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)
quelle
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])]; }
quelle
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)"; }
quelle
Meine Lösung: (Unterstützt Kurznotation)
$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
quelle