2010-06-10 2 views
28

Я хочу, чтобы пользователи на моем сайте могли выбирать гексагонный цвет, и я просто хочу отображать белый текст для темных цветов и черного текста для светлых цветов. Вы можете определить яркость из шестнадцатеричного кода (желательно PHP)?Hex Code Brightness PHP?

ответ

40
$hex = "78ff2f"; //Bg color in hex, without any prefixing #! 

//break up the color in its RGB components 
$r = hexdec(substr($hex,0,2)); 
$g = hexdec(substr($hex,2,2)); 
$b = hexdec(substr($hex,4,2)); 

//do simple weighted avarage 
// 
//(This might be overly simplistic as different colors are perceived 
// differently. That is a green of 128 might be brighter than a red of 128. 
// But as long as it's just about picking a white or black text color...) 
if($r + $g + $b > 382){ 
    //bright color, use dark font 
}else{ 
    //dark color, use bright font 
} 
+0

Работает отлично, даже не нужно входить в оттенок и насыщенность! :) – Juddling

+0

В моем случае лучше использовать 250 вместо 382. Я не думаю, что полный зеленый цвет (# 00ff00) должен использовать светлый цветной шрифт, а полный красный - с темным цветом. Просто говорю. –

2

Вам необходимо преобразовать значения RGB в HLS/HSL (оттенок и насыщенность), затем вы можете использовать Lightness, чтобы определить, нужен ли вам легкий текст или темный текст.

This page содержит некоторые сведения о том, как преобразовать в PHP, а также выбрать дополнительный цвет из этого.

Я только что заметил, что сайт является сайтом астрологии - так извиняйтесь, если кто-то обижен.

+1

О сайте астрологии: да, это ** ужасающим ** (Нет, шучу, интересно у них есть такое соответствующий раздел программирования на их сайте, я! не ожидал бы этого.) –

+0

@Marcel - Я думаю, что это показать код, лежащий в основе их диаграмм. – ChrisF

1

Если вы активировало расширение ImageMagick, вы можете просто создать объект ImagickPixel, вызовите SetColor с шестнадцатеричным значением, а затем вызвать getHSL() (и получить последний элемент полученного массива я полагаю) ...

17

Я сделал один похожий - но на основе взвешиваний каждого цвета (based on the C# version of this thread)

function readableColour($bg){ 
    $r = hexdec(substr($bg,0,2)); 
    $g = hexdec(substr($bg,2,2)); 
    $b = hexdec(substr($bg,4,2)); 

    $contrast = sqrt(
     $r * $r * .241 + 
     $g * $g * .691 + 
     $b * $b * .068 
    ); 

    if($contrast > 130){ 
     return '000000'; 
    }else{ 
     return 'FFFFFF'; 
    } 
} 

echo readableColour('000000'); // Output - FFFFFF 

EDIT: Небольшая оптимизация: Sqrt известен как дорогостоящая математическая операция, которая, вероятно, не учитывается в большинстве сценариев, но в любом случае ее можно было бы избежать, выполняя что-то подобное.

function readableColour($bg){ 
    $r = hexdec(substr($bg,0,2)); 
    $g = hexdec(substr($bg,2,2)); 
    $b = hexdec(substr($bg,4,2)); 

    $squared_contrast = (
     $r * $r * .299 + 
     $g * $g * .587 + 
     $b * $b * .114 
    ); 

    if($squared_contrast > pow(130, 2)){ 
     return '000000'; 
    }else{ 
     return 'FFFFFF'; 
    } 
} 

echo readableColour('000000'); // Output - FFFFFF 

Он просто не применяет SQRT, вместо него полномочия желаемого отрезать контраст на два, что гораздо дешевле, расчет

+0

Это просто здорово! Благодаря! –

+0

, чтобы получить значения RGB в dec, просто используйте эту строку: 'list ($ r, $ g, $ b) = sscanf ($ color,"% 02x% 02x% 02x ");' или если цвет $ начинается с # 'list ($ r, $ g, $ b) = sscanf ($ color," #% 02x% 02x% 02x ");' – JoTaRo

1

Я знаю, что это очень старая тема, но для пользователей, пришли из «Google Search», эта ссылка может быть тем, что они ищут. Я искал что-то подобное, и я думаю, что это хорошая идея, чтобы разместить его здесь:

https://github.com/mexitek/phpColors

use Mexitek\PHPColors\Color; 
// Initialize my color 
$myBlue = new Color("#336699"); 

echo $myBlue->isLight(); // false 
echo $myBlue->isDark(); // true 

Вот и все.

0

Я пробовал другой подход к этому, я использовал HSL (оттенок, насыщенность & легкость), чтобы проверить, свет ли темный или светлый. (Например, @ ChrisF сказал в своем ответе)

функция:

function colorislight($hex) { 
    $hex  = str_replace('#', '', $hex); 
    $r   = (hexdec(substr($hex, 0, 2))/255); 
    $g   = (hexdec(substr($hex, 2, 2))/255); 
    $b   = (hexdec(substr($hex, 4, 2))/255); 
    $lightness = round((((max($r, $g, $b) + min($r, $g, $b))/2) * 100)); 
    return ($lightness >= 50 ? true : false); 
} 

На обратной линии он проверяет, если процент воздушность выше, чем 50%, и возвращает истину, в противном случае возвращается ложь. Вы можете легко изменить его, чтобы вернуть true, если цвет имеет 30% -ную легкость и т. Д. Переменная $lightness может возвращать от 0 до 100 0 самой темной, а 100 - самой легкой.

как использовать функцию:

$color = '#111111'; 
if (colorislight($color)) { 
    echo 'this color is light'; 
} 
else { 
    echo 'this color is dark'; 
}