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

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

Цвет в формате 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

С помощью приведенной функции и регулярного выражения можно заменить цвета, например в CSS-стилях.

$css = '
	body {
		color: #000; 
		background: #4545;
	}
	header {
		color: #111111; 
		background: #00000080;
	}
';

$new = preg_replace_callback(
	'/#(?:[0-9a-f]{3,8})/i', 
	function($matches){
		return hexToRgb($matches[0], true);
	}, 
	$css
);

echo $new;
PHP

Результат:

body {
	color: rgb(0,0,0); 
    background: rgba(17,85,68,0.33);
}
header {
	color: rgb(17,17,17); 
    background: rgba(0,0,0,0.5);
}

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

Замена всех цветов в текстовой переменной:

$css = '
	body {
		color: rgb(0,0,0); 
		background: rgba(17,85,68,0.33);
	}
	header {
		color: rgb(17,17,17); 
		background: rgba(0,0,0,0.5);
	}
';

$new = preg_replace_callback(
	'/((rgba)\((\d{1,3},\s?){3}(1|0?\.?\d+)\)|(rgb)\(\d{1,3}(,\s?\d{1,3}){2}\))/i', 
	function($matches){
		return strRgbToHex($matches[0]);
	}, 
	$css
);

echo $new;
PHP

Результат:

body {
	color: #000000; 
	background: #11554455;
}
header {
	color: #111111; 
	background: #00000080;
}
14.04.2020
9663

Комментарии

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

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

Сборник CSS градиентов
Подборка 23-х фонов с линейным и радиальным градиентом.
42062
+7
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
6456
+1
Извлечение данных с помощью регулярных выражений PHP
Получение данных с помощью функций preg_match и preg_match_all.
20740
+5
Генерация паролей в PHP
В PHP есть несколько функций для генерации случайного числа, это rand(), mt_rand() и random_int().
11117
+5
Таблица символов ASCII
Список из 256 символов и их коды в ASCII.
406843
+34
Работа с директориями в PHP
Набор PHP функций для работы с директориями, получение списка файлов в папке, копирование и удаление содержимого папок.
17230
+1