Подтвердить что ты не робот

С учетом цвета фона, черного или белого текста?

Я пытаюсь найти метод определения, использовать ли черный или белый текст, учитывая цвет фона (как шестнадцатеричное значение). Кто-нибудь имел дело с этим раньше? Есть ли эффективный способ сделать это?

В моем случае я бы использовал PHP для реализации логики (хотя любой опыт с этим на других языках приветствуется).

4b9b3361

Ответ 1

Взгляните на эту страницу: Вычисление цветового контраста с PHP

Имейте в виду, что если черно-белый - ваш единственный выбор, у вас обязательно будут случаи, когда ни один из них не работает особенно замечательно.

Ответ 2

Я думаю, что лучший способ - алгоритм Luminosity Contrast:

function getContrastColor($hexColor) {

        // hexColor RGB
        $R1 = hexdec(substr($hexColor, 1, 2));
        $G1 = hexdec(substr($hexColor, 3, 2));
        $B1 = hexdec(substr($hexColor, 5, 2));

        // Black RGB
        $blackColor = "#000000";
        $R2BlackColor = hexdec(substr($blackColor, 1, 2));
        $G2BlackColor = hexdec(substr($blackColor, 3, 2));
        $B2BlackColor = hexdec(substr($blackColor, 5, 2));

         // Calc contrast ratio
         $L1 = 0.2126 * pow($R1 / 255, 2.2) +
               0.7152 * pow($G1 / 255, 2.2) +
               0.0722 * pow($B1 / 255, 2.2);

        $L2 = 0.2126 * pow($R2BlackColor / 255, 2.2) +
              0.7152 * pow($G2BlackColor / 255, 2.2) +
              0.0722 * pow($B2BlackColor / 255, 2.2);

        $contrastRatio = 0;
        if ($L1 > $L2) {
            $contrastRatio = (int)(($L1 + 0.05) / ($L2 + 0.05));
        } else {
            $contrastRatio = (int)(($L2 + 0.05) / ($L1 + 0.05));
        }

        // If contrast is more than 5, return black color
        if ($contrastRatio > 5) {
            return '#000000';
        } else { 
            // if not, return white color.
            return '#FFFFFF';
        }
}

// Will return '#FFFFFF'
echo getContrastColor('#FF0000');

Некоторые результаты:

enter image description here

ПРИМЕЧАНИЕ. Цвет шрифта определяется предыдущей функцией. Число в скобках - это коэффициент контрастности.



Другой самый простой и менее точный способ, называемый YIQ (потому что он преобразует цветовое пространство RGB в YIQ):

public function getContrastColor($hexcolor) {               
    $r = hexdec(substr($hexcolor, 1, 2));
    $g = hexdec(substr($hexcolor, 3, 2));
    $b = hexdec(substr($hexcolor, 5, 2));
    $yiq = (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
    return ($yiq >= 128) ? 'black' : 'white';
}                   

Ответ 3

  function getTextColour($hex){
    list($red, $green, $blue) = sscanf($hex, "#%02x%02x%02x");
    $luma = ($red + $green + $blue)/3;

    if ($luma < 128){
      $textcolour = "white";
    }else{
      $textcolour = "black";
    }
    return $textcolour;
  }

Ответ 4

Вот алгоритм, который можно использовать для расчета коэффициента контрастности яркости вашего текста:

http://juicystudio.com/services/aertcolourcontrast.php

Вы можете использовать эту формулу с белыми и черными значениями для расчета, которая дает вам более высокое соотношение и, следовательно, более читаемый текст.

Ответ 5

Вы должны взглянуть на библиотеку цветов CSS. Он реализован в PHP и выполняет всю тяжелую работу для вас.

Ответ 6

Простым, но не идеальным решением было бы суммирование отдельных компонентов (RGB), и чем больше это значение, тем светлее цвет. Поэтому для высокой ценности вы можете использовать черный как передний план, а для низкого значения - белый.

Затем вы можете улучшить этот метод, создав конкретные случаи для оттенков серого (R = G = B), которые, за исключением очень темно-серого, не будут хорошо отображать белый текст.

Изменить: Это, конечно, означает, что вам нужно знать формат хранилища RGB в шестнадцатеричном значении, стандартное хранилище 24bpp - 0x00RRGGBB для 8 шестнадцатеричных цифр.

Ответ 7

я бы вычислил среднее значение компонентов rgb, а затем решил, использовать ли черный или белый, например. белый до 0x66