C # получить хороший цвет для метки - PullRequest
0 голосов
/ 26 мая 2018

У меня есть случайный цвет для моего фона в моем приложении Windows Forms.Теперь я хочу отобразить ярлык.

Но если случайный цвет белый, а ярлык тоже, то ярлык не виден.

Как получить идеальный цвет, видимый на моемцвет фона (Мой фоновый цвет - случайный цвет из System.Drawing.Color)

1 Ответ

0 голосов
/ 26 мая 2018

Существуют различные способы обеспечения правильного контраста.

Вариант один : я обычно придерживаюсь текста черного или белого, в зависимости от яркости заднего цвета.

enter image description here

Чтобы получить яркость, можно просто воспользоваться встроенной функцией Color.GetBrightness ()

К сожалению,это не очень хорошее решение, так как результат неверно воспринимается;То есть: зеленый и желтый имеют одинаковые значения, что, очевидно, не то, что воспримут наши глаза.

Вместо этого поможет эта крошечная функция:

float getBrightness(Color c) 
{  return (c.R * 0.299f + c.G * 0.587f + c.B *0.114f) / 256f; }

Теперь мы можем выбрать либо черный, либоБелый:

Label lbl = new Label();
lbl.BackColor = colors[rnd.Next(colors.Count)];
lbl.ForeColor = getBrightness(lbl.BackColor) < 0.55 ? Color.White : Color.Black;

Код использует список известных цветов:

List<Color> colors = ((KnownColor[])Enum.GetValues(typeof(KnownColor))).
                     Select(x => Color.FromKnownColor(x)).ToList();

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

while (Math.Abs(c1.GetBrightness() - c2.GetBrightness()) < 0.5f ) 
            c2 = colors[rnd.Next(colors.Count)];

Обратите внимание, что вы не должны слишком сильно увеличивать значение epsilon, иначе он не найдет подходящий цвет.Это происходит при попытке найти цвет, который слишком далеко от средней яркости!Вы можете добавить счетчик и через некоторое время выбрать просто черный или белый.


Вариант три : еще один способ - создать цвет с помощью Color.FromArgb() .

Вы можете начать с инверсии каждого канала, что даст хорошие цветовые контрасты;но если цвет имеет среднюю яркость и / или насыщенность, вам придется исправить, возможно, снова, выбрав черный или белый цвет.


Примечание: для приведенного выше изображения я перечислил все KnownColors , который уже выглядит довольно случайно.

Чтобы добавить порядок, вы можете отсортировать список по свойствам цвета, например, по оттенку, затем по яркости:

List<Color> allcolors = ((KnownColor[])Enum.GetValues(typeof(KnownColor)))
    .Select(x => Color.FromKnownColor(x))
    .OrderBy(x => x.GetHue()).ThenBy(x => getBrightness(x)).ToList();
...