user123_456
user123_456

Reputation: 5795

Convert hex color to RGB values in PHP

What would be a good way to convert hex color values like #ffffff into the single RGB values 255 255 255 using PHP?

Upvotes: 121

Views: 133559

Answers (18)

APH
APH

Reputation: 29

<?php
function cc2rgb($cc) { $cc=ltrim($cc,'#'); return list($r, $g, $b)=array_map('hexdec',str_split($cc,strlen($cc)/3)); }
?>

this is a simple (one line) function, based on many correct previous answer. i don't explain how it works, some guys did it before.

Upvotes: 0

Matthias
Matthias

Reputation: 181

Based on the high-rate answer -> https://stackoverflow.com/a/15202130/3884001

function hex2rgba( $color, $opacity ) {

    list($r, $g, $b) = sscanf($color, "#%02x%02x%02x");
    $output = "rgba($r, $g, $b, $opacity)";

    return $output;

}

than you can use it like

<?php
  $color = '#ffffff';
  hex2rgba($color, 0.5); 
?>

Upvotes: 7

nayemishan
nayemishan

Reputation: 1

If you want to get hex to RGB you can follow this:

class RGB
{        
    private $color; //#ff0000
    private $red;
    private $green;
    private $blue;

    public function __construct($colorCode = '')
    {
        $this->color = ltrim($colorCode, '#');
        $this->parseColor();
    }
    public function readRGBColor()
    {
        echo "Red = {$this->red}\nGreen = {$this->green}\nBlue = {$this->blue}";
    }
    private function parseColor()
    {
        if ($this->color) {
            list($this->red, $this->green, $this->blue) = sscanf($this->color, '%02x%02x%02x');
        } else {
            list($this->red, $this->green, $this->blue) = array(0, 0, 0);
        }
    }
}

$myColor = new RGB("#ffffff");
$myColor->readRGBColor();

Upvotes: 0

gregbast1994
gregbast1994

Reputation: 477

Borrowing from @jhon's answer - this will return the rgb in string format with an option for opacity.

function convert_hex_to_rgba($hex, $opacity = 1){
    list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x");
    return sprintf('rgba(%s, %s, %s, %s)', $r, $g, $b, $opacity);
}

convert_hex_to_rgba($bg_color, 0.9) // rgba(2,2,2,0.9)

Upvotes: 5

user11809641
user11809641

Reputation: 895

I wrote a simple function like so, which supports an input value with or without beginning # and it can also take 3 or 6 character hex code input:


function hex2rgb( $color ) {

    if ($color[0] == '#') {
        $color = substr($color, 1);
    }
    list($r, $g, $b) = array_map("hexdec", str_split($color, (strlen( $color ) / 3)));
    return array( 'red' => $r, 'green' => $g, 'blue' => $b );
}

This returns an associative array that can be access as $color['red'], $color['green'], $color['blue'];

See also here from CSS Tricks.

Upvotes: 6

arosolino
arosolino

Reputation: 1077

For anyone that is interested this is another very simple way of doing it. This example assumes there is exactly 6 characters and no preceding pound sign.

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

Here is an example the supports 4 different inputs (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)
);

Upvotes: 46

Starboy
Starboy

Reputation: 117

My solution: (Supports short notation)

$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

Upvotes: 0

John
John

Reputation: 4092

If you want to convert hex to rgb you can use sscanf:

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

Output:

#ff9900 -> 255 153 0

Upvotes: 381

Mike Smit
Mike Smit

Reputation: 87

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

Upvotes: 0

Andreas Mennel
Andreas Mennel

Reputation: 1

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

Upvotes: 0

Niek van der Steen
Niek van der Steen

Reputation: 1433

Check out PHP's hexdec() and dechex() functions: http://php.net/manual/en/function.hexdec.php

Example:

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

Upvotes: 62

RatajS
RatajS

Reputation: 1429

You can use the function hexdec(hexStr: String) to get the decimal value of a hexadecimal string.

See below for an example:

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

This will print rgb(255, 255, 255)

Upvotes: 22

Manmeet Khurana
Manmeet Khurana

Reputation: 377

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

Upvotes: 0

TURTLE
TURTLE

Reputation: 3847

I made a function which also returns alpha if alpha is provided as a second parameter the code is below.

The function

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

Example of function responses

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
)

If you'd like to return the rgb(a) in CSS format just replace the return $rgb; line in the function with return implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';

Upvotes: 53

Martin
Martin

Reputation: 61

My approach to take care of hex colors with or without hash, single values or pair values:

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

Upvotes: 5

JoyGuru
JoyGuru

Reputation: 1833

Convert Color Code HEX to 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);

Output

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

I have found this reference from here - Convert Color Hex to RGB and RGB to Hex using PHP

Upvotes: 5

Alexxus
Alexxus

Reputation: 992

I've put @John's answer and @iic's comment/idea together into a function which can handle both, the usual hex color codes and the shorthand color codes.

A short explanation:

With scanf I read the r, g and b values from the hex color as strings. Not as hex values like in @John's answer. In case of using shorthand color codes, the r, g and b strings have to be doubled ("f" -> "ff" etc.) before converting them to decimals.

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

Upvotes: 4

John Smith
John Smith

Reputation: 1814

try this, it converts its arguments (r, g, b) to hexadecimal html-color string #RRGGBB Arguments are converted to integers and trimmed to 0..255 range

<?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 and the other way round

# character in the beginning can be omitted. Function returns array of three integers in range (0..255) or false when it fails to recognize color format.

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

Upvotes: 0

Related Questions