Несколько примеров как перевести цвета из HEX в RGB и обратно с помощью PHP.
Цвет в формате десятичного числа (например 8675162
) используется в библиотеке PHP GD. Пример конвертации цвета, полученного функцией imagecolorat()
в HEX (#000000
).
Цвет в формате HEX можно преобразовать в RGB следующим образом:
Результат:
Array
(
[0] => 255
[1] => 221
[2] => 102
)
Второй вариант.
$dec = hexdec("ff9900");
$rgb = array(
'red' => 0xFF & ($dec >> 0x10),
'green' => 0xFF & ($dec >> 0x8),
'blue' => 0xFF & $dec
);
print_r($rgb);
Результат:
Array
(
[red] => 255
[green] => 153
[blue] => 0
)
Но HEX может быть представлен в четырех вариантах: полный #ffdd66
, сокращенный #fd6
, с альфа-каналом #ffdd6655
и его краткой записью #fd65
.
Альфа-канал в CSS задается значением от 0 до 1 (0 – полностью прозрачный), в PHP используется от 0 до 127 (127 – полностью прозрачный), реже от 0 до 255 (0 – полностью прозрачный).
Учитывая все перечисленное, была написана универсальная функция, которая возвращает результат в виде массива или строки:
/**
* Преобразование HEX в RGB
*
* @parm string $hex Цвет
* @parm bool $return_string Результат в виде строки или массива
* @return array|string|bool В случаи ошибки false
*/
function hexToRgb($hex, $return_string = false)
{
$hex = trim($hex, ' #');
$size = strlen($hex);
if ($size == 3 || $size == 4) {
$parts = str_split($hex, 1);
$hex = '';
foreach ($parts as $row) {
$hex .= $row . $row;
}
}
$dec = hexdec($hex);
$rgb = array();
if ($size == 3 || $size == 6) {
$rgb['red'] = 0xFF & ($dec >> 0x10);
$rgb['green'] = 0xFF & ($dec >> 0x8);
$rgb['blue'] = 0xFF & $dec;
if ($return_string) {
return 'rgb(' . implode(',', $rgb) . ')';
}
} elseif ($size == 4 || $size == 8) {
$rgb['red'] = 0xFF & ($dec >> 0x16);
$rgb['green'] = 0xFF & ($dec >> 0x10);
$rgb['blue'] = 0xFF & ($dec >> 0x8);
$rgb['alpha'] = 0xFF & $dec;
if ($return_string) {
$rgb['alpha'] = round(($rgb['alpha'] / (255 / 100)) / 100, 2);
return 'rgba(' . implode(',', $rgb) . ')';
} else {
$rgb['alpha'] = 127 - ($rgb['alpha'] >> 1);
}
} else {
return false;
}
return $rgb;
}
RGB в виде массива:
print_r(hexToRgb('#fd6')); // Array([red] => 255, [green] => 221, [blue] => 102)
print_r(hexToRgb('#ffdd66')); // Array([red] => 255, [green] => 221, [blue] => 102)
print_r(hexToRgb('#fd60')); // Array([red] => 255, [green] => 221, [blue] => 102, [alpha] => 127)
print_r(hexToRgb('#ffdd6600')); // Array([red] => 255, [green] => 221, [blue] => 102, [alpha] => 127)
print_r(hexToRgb('#ffdd6680')); // Array([red] => 255, [green] => 221, [blue] => 102, [alpha] => 63)
print_r(hexToRgb('#ffdd66fa')); // Array([red] => 255, [green] => 221, [blue] => 102, [alpha] => 2)
RGB в виде строки:
echo hexToRgb('#fd6', true); // rgb(255,221,102)
echo hexToRgb('#ffdd66', true); // rgb(255,221,102)
echo hexToRgb('#fd60', true); // rgba(255,221,102,0)
echo hexToRgb('#ffdd6600', true); // rgba(255,221,102,0)
echo hexToRgb('#ffdd6680', true); // rgba(255,221,102,0.5)
echo hexToRgb('#ffdd66fa', true); // rgba(255,221,102,0.98)
Функция для перевода RGB(a) в HEX(a) по отдельным компонентам цветов, с поддержкой альфа канала (значения 0...127).
/**
* Преобразование RGB в HEX
*
* @param intiger $red 0...255
* @param intiger $green 0...255
* @param intiger $blue 0...255
* @param intiger $alpha 0...127
* @return string
*/
function rgbToHex($red, $green, $blue, $alpha = null)
{
$result = '#';
foreach (array($red, $green, $blue) as $row) {
$result .= str_pad(dechex($row), 2, '0', STR_PAD_LEFT);
}
if (!is_null($alpha)) {
$alpha = floor(255 - (255 * ($alpha / 127)));
$result .= str_pad(dechex($alpha), 2, '0', STR_PAD_LEFT);
}
return $result;
}
echo rgbToHex(255, 221, 102); // #ffdd66
echo rgbToHex(255, 221, 102, 127); // #ffdd6600
echo rgbToHex(255, 221, 102, 63); // #ffdd6680
echo rgbToHex(255, 221, 102, 2); // #ffdd66fa
Вторая функия преобразовывает RGB-цвет из строки в формате CSS
rgb(255,221,102)
или rgba(255,221,102,0.4)
.
/**
* Преобразование строки «rgb(255,221,102)» в HEX
*
* @param string $color
* @return string|bool
*/
function strRgbToHex($color)
{
preg_match_all("/\((.+?)\)/", $color, $matches);
if (!empty($matches[1][0])) {
$rgb = explode(',', $matches[1][0]);
$size = count($rgb);
if ($size == 3 || $size == 4) {
if ($size == 4) {
$alpha = array_pop($rgb);
$alpha = floatval(trim($alpha));
$alpha = ceil(($alpha * (255 * 100)) / 100);
array_push($rgb, $alpha);
}
$result = '#';
foreach ($rgb as $row) {
$result .= str_pad(dechex(trim($row)), 2, '0', STR_PAD_LEFT);
}
return $result;
}
}
return false;
}
function hexToHsl($hex)
{
$hex = trim($hex, ' #');
$red = hexdec(substr($hex, 0, 2)) / 255;
$green = hexdec(substr($hex, 2, 2)) / 255;
$blue = hexdec(substr($hex, 4, 2)) / 255;
$cmin = min($red, $green, $blue);
$cmax = max($red, $green, $blue);
$delta = $cmax - $cmin;
if ($delta === 0) {
$hue = 0;
} elseif ($cmax === $red) {
$hue = (($green - $blue) / $delta) % 6;
} elseif ($cmax === $green) {
$hue = ($blue - $red) / $delta + 2;
} else {
$hue = ($red - $green) / $delta + 4;
}
$hue = round($hue * 60);
if ($hue < 0) {
$hue += 360;
}
$lightness = (($cmax + $cmin) / 2) * 100;
$saturation = $delta === 0 ? 0 : ($delta / (1 - abs(2 * $lightness - 1))) * 100;
if ($saturation < 0) {
$saturation += 100;
}
$lightness = round($lightness);
$saturation = round($saturation);
return array($hue, $saturation, $lightness);
}