Как рассчитать легко читаемый цвет для случайного заднего цвета? - PullRequest
1 голос
/ 22 июля 2010

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

Atm, я использую такой код:

if(Math.Abs(foreColor.GetBrightness() - backColor.GetBrightness()) <= 0.5f)
{
    if(foreColor.GetBrightness() > 0.5f)
    {
       foreColor = Color.Black;
    }
    else
    {
       foreColor = Color.White;
    }
}

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

Ответы [ 3 ]

1 голос
/ 22 июля 2010

Для каждого цветового компонента (допустим диапазон [0, 255] для каждого компонента), если он ниже 128, насытить его до 255; в противном случае сделайте ноль:

fg.r = bg.r < 128 ? 255 : 0;
fg.g = bg.g < 128 ? 255 : 0;
fg.b = bg.b < 128 ? 255 : 0;

Это по существу поместит цвет переднего плана как можно дальше в октант напротив цвета фона.

0 голосов
/ 19 октября 2014

Этот работает отлично.

gray = ((backColor.R*38 + backColor.G*75 + backColor.B*15) >> 7);
foreColor = gray < 128 ? Color.White : Color.Black;
0 голосов
/ 25 августа 2010

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

foreColor = Color.Black;
int changeToWhite = 0;
if(backColor.R <= 128)
{
    changeToWhite++;
}
if(backColor.G <= 128)
{
    changeToWhite++;
}
if(backColor.B <= 128)
{
    changeToWhite++;
}
if(changeToWhite > 1)
{
    foreColor = Color.White;
}

Обратите внимание на небольшую корректировку: <= Это гарантирует, что рассчитанный цвет будет белым в тех случаях, когда в некоторых «закрытых вызовах» вы получаете из окна выбора цвета по умолчанию. </p>

...