У меня 60% непрозрачная форма. И когда пользователь меняет цвет формы, иногда (в зависимости от выбранного цвета) он больше не может видеть текст в форме, потому что он слишком похож на цвет формы. Итак, я пытаюсь сделать, возможно, переключатель if /, чтобы увидеть, является ли выбранный BackColor формы темным или светлым. Если он темный, то весь текст в форме должен быть белым. Если он светлый, то весь текст в форме должен быть черным.
Это вообще возможно? Я видел это повсюду, но не уверен, что искать, не написав весь вопрос в поле поиска.
Любая помощь / предложения будут с благодарностью.
Спасибо, Джейсон.
3 ответа
Вы можете проверить, превышает ли сумма трех значений rgb половину максимального значения.
-> потому что 255,255,255 == белый (светлый) и 0,0,0 == черный (темный):
Например
R 255
G 140
B 170
=====
565
Макс: 765 (Среднее 382) Сумма: 565
Поскольку сумма 565 и выше среднего (темный <382 <светлый), цвет будет светлым. Таким образом, вы можете изменить цвет текста на темный.
Как насчет использования Color.GetBrightness()
для выяснить, насколько он светлый?
Этот метод проверяет, читаем ли контраст двух цветов:
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, они обычно показывают хорошо читаемый контраст.
Тестовый код для обработчика кликов 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;
}
}
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.