2013-03-04 4 views
42

Что было бы хорошим способом конвертировать значения шести цветов, такие как #ffffff, в единые значения RGB 255 255 255 с использованием PHP?Преобразование шестнадцатеричного цвета в значения RGB в PHP

+0

Эти два шестигранных являются того же типа? Сначала представляем белый, второй черный ... что вы пытаетесь сделать? – BenOfTheNorth

+0

'$ выход = Sprintf ('% 06x', 0xffffff - HexDec (LTRIM ($ ввода, '#'));' однако это, вероятно, слишком упрощенным, и вы, вероятно, хотите, чтобы проанализировать компоненты RGB отдельно, пожалуйста, объясните точно, что это вы хотели сделать. – DaveRandom

+0

вашего пример целевого представления (а) не образует представление цвета, которую я видел, и (б) не соответствует вашему «без' '#» требования. – Quentin

ответ

30

Заканчивать HexDec PHP() и DecHex() функции http://php.net/manual/en/function.hexdec.php Пример:

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

вопрос был отредактирован –

+0

@den Этот ответ должен все еще работать нормально даже с отредактированным вопросом. –

162

Если вы хотите, чтобы преобразовать шестнадцатеричный в RGB можно использовать sscanf:

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

Выход:

#ff9900 -> 255 153 0 
+0

есть что-нибудь, поэтому я могу преобразовать, как я спросил в своем вопросе? Могу ли я выводить как # 000000 –

+10

Хороший чистый подход с 'sscanf()', я помещаю это в свою коробку с волшебными трюками. К сожалению, похоже, что OP слишком ленив, чтобы понять, что вы делаете, и куда вы идете с этой идеей. – DaveRandom

+0

вопрос был отредактирован –

0

попробуйте это , Он преобразует его аргументы (R, G, B) в шестнадцатеричные HTML-строке цвета #RRGGBB Аргументов преобразуются в целые числа и подрезал до 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; 
} 
?> 

ой и наоборот

# символ в начале может быть опущен. Функция возвращает массив из трех целых чисел в диапазоне (0..255) или false, если не распознает цветовой формат.

<?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

вопрос был отредактирован –

18

Для всех, кому это интересно, это еще один очень простой способ сделать это. В этом примере предполагается, что существует ровно 6 символов и знак предшествующего фунта.

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

Вот пример опоры 4 различных входов (азбука, 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)); 
+10

Используйте 'ltrim ($ colorName, '#')' вместо '$ colorName', чтобы позаботиться о #, если он может быть там – mikeytown2

3

Я положил @ Джон Ответим и @ IIC замечании/идеи вместе в функция, которая может обрабатывать оба, обычные шестнадцатеричные цветовые коды и сокращенные цветовые коды.

Краткое объяснение:

С scanf я прочитал R, G и Ь значения из шестнадцатеричного цвета в виде строк. Не как шестнадцатеричные значения, как в ответе @ Джона. В случае использования сокращенных цветовых кодов строки r, g и b должны быть удвоены («f» -> «ff» и т. Д.), Прежде чем преобразовывать их в десятичные числа.

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

Я сделал функцию, которая также возвращает альфу, если альфа предоставляется в качестве второго параметра, приведенного ниже.

Функция

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

Пример ответов функции

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 
) 

Если вы хотите, чтобы вернуть РГБ (а) в формате CSS просто заменить return $rgb; линию в функция return implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';

2

Преобразовать Цветовой код HEX в 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); 

Выход

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

Я нашел эту ссылку здесь - Convert Color Hex to RGB and RGB to Hex using PHP

1

Мой подход, чтобы заботиться о шестигранных цветов с или без хэш , отдельные значения или значения пары:

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

Вы можете попробовать этот простой фрагмент кода ниже.

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

Это вернет 123.222.132

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

Вы можете использовать функцию hexdec(hexStr: String), чтобы получить десятичное значение шестнадцатеричной строки.

Ниже для примера:

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

Это напечатает rgb(255, 255, 255)

Смежные вопросы