Эти два гексагона одного типа? Первый представляет белый цвет, второй - черный ... что вы пытаетесь сделать?
BenOfTheNorth
$output = sprintf('%06x', 0xffffff - hexdec(ltrim($input, '#'));однако это, вероятно, слишком упрощено, и вы, вероятно, захотите проанализировать компоненты RGB отдельно, пожалуйста, объясните, что именно вы хотите сделать.
DaveRandom 04
Пример вашего целевого представления (a) не формирует никакого представления цвета, который я видел, и (b) не соответствует вашему требованию "без #".
Quentin
#ffffffи #00000представляет собой белый и черный соответственно. И для года информация #00000также является шестнадцатеричным, а не целым числом. Здесь fпредставляет 15.
Рави
Что вы имеете в виду под словом "конвертировать и использовать только целое число" ?
Чтобы использовать этот ответ для полного преобразования из заданного шестнадцатеричного значения в rgb, один из вариантов следующий: $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
290
Если вы хотите преобразовать шестнадцатеричный формат в RGB, вы можете использовать sscanf :
есть ли что-нибудь, чтобы я мог получить конверсию, как я задал в своем вопросе? Могу ли я получить вывод вроде # 000000
user123_456 04
14
Хороший чистый подход с sscanf(), я кладу это в свой ящик волшебных трюков. К сожалению, похоже, что OP слишком ленив, чтобы понять, что вы делаете и куда вы шли с этой идеей.
@iiic просто пишет тест для вашего однострочника. #ccc вернет 12, 12, 12 вместо 204, 204, 204, поэтому, если вы вернете его обратно в шестнадцатеричный формат, вы получите цвет # 0c0c0c.
Джон Линхарт
1
# F0F переводится в # FF00FF, поэтому для сокращенного списка цветов ($ r, $ g, $ b) = sscanf ('#'. Implode ('', array_map ('str_repeat', str_split (str_replace ('#', '', $ hex)), [2,2,2])), "#% 02x% 02x% 02x");
aconrad
41
Я создал функцию, которая также возвращает альфа, если альфа предоставляется в качестве второго параметра, код ниже.
Если вы хотите вернуть rgb (a) в формате CSS, просто замените return $rgb;строку в функции наreturn implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';
Для всех, кому это интересно, это еще один очень простой способ сделать это. В этом примере предполагается, что имеется ровно 6 символов без предшествующего знака фунта.
Используйте ltrim($colorName, '#')вместо, $colorNameчтобы позаботиться о #, если он может быть там
mikeytown2
Ух ты, твоя вторая строка кода невероятна ... она принимает # или нет и 3 или 6 символов. Я думаю, что это лучший подход из всех примеров кода на этой странице. Я добавляю это в закладки для будущих проектов.
hargobind
15
Вы можете использовать эту функцию hexdec(hexStr: String)для получения десятичного значения шестнадцатеричной строки.
Я объединил ответ @ John и комментарий / идею @ iic в функцию, которая может обрабатывать как обычные шестнадцатеричные цветовые коды, так и сокращенные цветовые коды.
Краткое объяснение:
С помощью scanf я считываю значения r, g и b из шестнадцатеричного цвета как строки. Не как шестнадцатеричные значения, как в ответе @John. В случае использования сокращенных цветовых кодов строки r, g и b должны быть удвоены («f» -> «ff» и т. Д.) Перед преобразованием их в десятичные дроби.
попробуйте это, он преобразует свои аргументы (r, g, b) в шестнадцатеричную строку цвета html #RRGGBB Аргументы преобразуются в целые числа и обрезаются до диапазона 0..255
Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста , измените свой ответ , чтобы добавить объяснения и дать указание о том , что применять ограничения и допущения.
При ответе будет гораздо полезнее, если вы объясните, почему это предпочтительное решение. Цель состоит в том, чтобы обучить, а не просто решить конкретную проблему.
$output = sprintf('%06x', 0xffffff - hexdec(ltrim($input, '#'));
однако это, вероятно, слишком упрощено, и вы, вероятно, захотите проанализировать компоненты RGB отдельно, пожалуйста, объясните, что именно вы хотите сделать.#
".#ffffff
и#00000
представляет собой белый и черный соответственно. И для года информация#00000
также является шестнадцатеричным, а не целым числом. Здесьf
представляет 15.Ответы:
Ознакомьтесь с PHP
hexdec()
иdechex()
функциями: http://php.net/manual/en/function.hexdec.phpПример:
$value = hexdec('ff'); // $value = 255
источник
$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, вы можете использовать sscanf :
<?php $hex = "#ff9900"; list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x"); echo "$hex -> $r $g $b"; ?>
Вывод:
#ff9900 -> 255 153 0
источник
sscanf()
, я кладу это в свой ящик волшебных трюков. К сожалению, похоже, что OP слишком ленив, чтобы понять, что вы делаете и куда вы шли с этой идеей.#ccc
):(strlen($hex) === 4) ? list($r, $g, $b) = sscanf($hex, "#%1x%1x%1x") : list($r, $g, $b) = sscanf($hex, "#%2x%2x%2x");
Я создал функцию, которая также возвращает альфа, если альфа предоставляется в качестве второго параметра, код ниже.
Функция
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 )
Если вы хотите вернуть rgb (a) в формате CSS, просто замените
return $rgb;
строку в функции наreturn implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';
источник
Для всех, кому это интересно, это еще один очень простой способ сделать это. В этом примере предполагается, что имеется ровно 6 символов без предшествующего знака фунта.
list($r, $g, $b) = array_map('hexdec', str_split($colorName, 2));
Вот пример поддержки 4 разных входов (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) );
источник
ltrim($colorName, '#')
вместо,$colorName
чтобы позаботиться о #, если он может быть тамВы можете использовать эту функцию
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)
источник
Мой подход к использованию шестнадцатеричных цветов с хешем, одиночными значениями или парными значениями или без них:
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' ) );
источник
Вы можете попробовать этот простой фрагмент кода ниже.
list($r, $g, $b) = sscanf(#7bde84, "#%02x%02x%02x"); echo $r . "," . $g . "," . $b;
Это вернет 123,222,132
источник
Преобразование цветового кода 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 )
Я нашел эту ссылку отсюда - Преобразование шестнадцатеричного цвета в RGB и RGB в шестнадцатеричное с помощью PHP
источник
Я объединил ответ @ John и комментарий / идею @ iic в функцию, которая может обрабатывать как обычные шестнадцатеричные цветовые коды, так и сокращенные цветовые коды.
Краткое объяснение:
С помощью scanf я считываю значения r, g и b из шестнадцатеричного цвета как строки. Не как шестнадцатеричные значения, как в ответе @John. В случае использования сокращенных цветовых кодов строки 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) ]; }
источник
попробуйте это, он преобразует свои аргументы (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); } ?>
источник
//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]);
источник
Это единственное решение, которое у меня сработало. Некоторые ответы были недостаточно последовательными.
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)
источник
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])]; }
источник
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)"; }
источник
Мое решение: (Поддерживает короткие обозначения)
$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
источник