Преобразование цветов в PHP

Несколько примеров как перевести цвета из HEX в RGB и обратно с помощью PHP.

1

Цвет в формате десятичного числа (например 8675162) используется в библиотеке PHP GD. Пример конвертации цвета, полученного функцией imagecolorat() в HEX (#000000).

$color = '#' . dechex(imagecolorat($img, 0, 0));
echo $color;
PHP
2

Цвет в формате HEX можно преобразовать в RGB следующим образом:

$hex = "#ff9900";
$rgb = sscanf($hex, "#%02x%02x%02x");
print_r($rgb);
PHP

Результат:

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

Результат:

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

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)
PHP

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)
PHP
3

Функция для перевода 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;
}
PHP
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
PHP

Вторая функия преобразовывает 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;
}
PHP
echo strRgbToHex('rgb(255,221,102)');       // #ffdd66
echo strRgbToHex('rgba(255,221,102,0)');    // #ffdd6600 
echo strRgbToHex('rgba(255,221,102,.5)');   // #ffdd6680
echo strRgbToHex('rgba(255,221,102,0.98)'); // #ffdd66fa
PHP
4
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);
}
PHP
14.04.2020, обновлено 16.12.2022
15895

Комментарии

, чтобы добавить комментарий.

Другие публикации

Сборник CSS градиентов
Подборка 23-х фонов с линейным и радиальным градиентом.
77318
+9
Работа с массивами PHP – создание, наполнение, удаление
Основные примеры работы с массивами PHP. Создание, наполнение, извлечение удаление значений.
99166
+13
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
18424
+2
Работа с числами в PHP
Сборник математических функций PHP и примеры их использования.
21561
+5
Генерация паролей в PHP
В PHP есть несколько функций для генерации случайного числа, это rand(), mt_rand() и random_int().
22711
+11
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
65859
+33