Шестнадцатеричный код Яркость PHP? - PullRequest
29 голосов
/ 10 июня 2010

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

Ответы [ 6 ]

44 голосов
/ 10 июня 2010
$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
}
18 голосов
/ 12 декабря 2011

Я сделал одно подобное - но на основе весов каждого цвета (на основе версии этой темы на C #)

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, вместо этого он усиливает желаемый обрезанный контраст на два, что намного дешевле в расчете

3 голосов
/ 29 января 2015

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

https://github.com/mexitek/phpColors

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

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

Вот и все.

2 голосов
/ 10 июня 2010

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

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

Я только что заметил, что сайт является астрологическим сайтом - поэтому извиняюсь, если кто-то обиделся.

1 голос
/ 10 июня 2010

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

0 голосов
/ 10 сентября 2015

Я попробовал другой подход к этому, я использовал процент яркости 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, в противном случае возвращается false. Вы можете легко изменить его на true, если цвет имеет 30% яркости и так далее. Переменная $lightness может возвращать от 0 до 100 0, что является самым темным, а 100 - самым светлым.

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

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