Konvertieren Sie Hex-Farben in RGB-Werte in PHP

82

Was wäre ein guter Weg, um Hex-Farbwerte wie #ffffffin 255 255 255PHP in einzelne RGB-Werte umzuwandeln ?

user123_456
quelle
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 ?
Sverri M. Olsen

Antworten:

56

Überprüfen Sie die PHPs hexdec()und dechex()Funktionen: http://php.net/manual/en/function.hexdec.php

Beispiel:

$value = hexdec('ff'); // $value = 255
Niek van der Steen
quelle
6
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 :

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

Ausgabe:

#ff9900 -> 255 153 0
John
quelle
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.
DaveRandom
10
und für Kurzfarben ( #ccc): (strlen($hex) === 4) ? list($r, $g, $b) = sscanf($hex, "#%1x%1x%1x") : list($r, $g, $b) = sscanf($hex, "#%2x%2x%2x");
II.
4
@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.

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

Jake
quelle
32

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)
);
Arosolino
quelle
11
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.

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)

RatajS
quelle
Einfachere Lösung zu verstehen und anzuwenden. Tks!
Diego Somar
5

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' ) );
Martin
quelle
5

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

IAmMilinPatel
quelle
4

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

JoyGuru
quelle
3

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

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);
}
?>
John Smith
quelle
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]);
Manmeet Khurana
quelle
0

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)
Raj Sharma
quelle
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])];
}
Andreas Mennel
quelle
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.
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)";
    }
Mike Smit
quelle
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.
Der Blechmann
0

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
Starboy
quelle