У меня 60% непрозрачная форма. И когда пользователь меняет цвет формы, иногда (в зависимости от выбранного цвета) он больше не может видеть текст в форме, потому что он слишком похож на цвет формы. Итак, я пытаюсь сделать, возможно, переключатель if /, чтобы увидеть, является ли выбранный BackColor формы темным или светлым. Если он темный, то весь текст в форме должен быть белым. Если он светлый, то весь текст в форме должен быть черным.

Это вообще возможно? Я видел это повсюду, но не уверен, что искать, не написав весь вопрос в поле поиска.

Любая помощь / предложения будут с благодарностью.

Спасибо, Джейсон.

11
jay_t55 29 Сен 2009 в 13:45
Есть еще одно решение здесь
 – 
Bobs
23 Янв 2013 в 11:35

3 ответа

Лучший ответ

Вы можете проверить, превышает ли сумма трех значений rgb половину максимального значения.

-> потому что 255,255,255 == белый (светлый) и 0,0,0 == черный (темный):

Например

R 255
G 140
B 170
=====
  565

Макс: 765 (Среднее 382) Сумма: 565

Поскольку сумма 565 и выше среднего (темный <382 <светлый), цвет будет светлым. Таким образом, вы можете изменить цвет текста на темный.

9
BvuRVKyUVlViVIc7 29 Сен 2009 в 13:52
Спасибо @Lichtamberg, я изначально думал об этом, но потом сумел убедить себя, что это не сработает. Но это так, очень ценно.
 – 
jay_t55
29 Сен 2009 в 14:48
1
Это сделало бы желтый темным, поскольку он (255, 255, 0).
 – 
David Thielen
1 Янв 2013 в 05:54

Как насчет использования Color.GetBrightness() для выяснить, насколько он светлый?

23
Jon Skeet 29 Сен 2009 в 13:49
Спасибо, @Jon. Очень признателен. :)
 – 
jay_t55
29 Сен 2009 в 14:46

Этот метод проверяет, читаем ли контраст двух цветов:

public static bool ContrastReadableIs(Color color_1, Color color_2)
{
    // Maximum contrast would be a value of "1.0f" which is the brightness
    // difference between "Color.Black" and "Color.White"
    float minContrast = 0.5f;

    float brightness_1 = color_1.GetBrightness();
    float brightness_2 = color_2.GetBrightness();

    // Contrast readable?
    return (Math.Abs(brightness_1 - brightness_2) >= minContrast);
}

Хотите, чтобы передний цвет был читаемым?
Вот простой и неплохой способ инвертировать фоновый цвет.
NB: эта инверсия не означает, что цвет и инвертированный цвет различаются по яркости, но если два цвета различаются по яркости не менее 0,5, они обычно показывают хорошо читаемый контраст.

Button with text "Am I readable?"

Тестовый код для обработчика кликов button1

Random r = new Random();

while (1 < 2)
{
    // Get a random fore- and backcolor
    Color foreColor = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256));
    Color backColor = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256));

    // Contrast readable?
    if (ContrastReadableIs(foreColor, backColor))
    {
        button1.ForeColor = foreColor;
        button1.BackColor = backColor;
        System.Media.SystemSounds.Beep.Play();
        break;
    }
}
5
Community 23 Май 2017 в 15:00