Я не очень разбираюсь в цветовой композиции, поэтому я придумал этот алгоритм, который на основе ошибок определит цвет фона на основе цвета шрифта:
public class BackgroundFromForegroundColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is Color))
return value;
Color color = (Color)value;
if (color.R + color.G + color.B > 550)
return new SolidColorBrush(Colors.Gray);
else if (color.R + color.G + color.B > 400)
return new SolidColorBrush(Colors.LightGray);
else
return new SolidColorBrush(Colors.White);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Я немного поработал над этим, но я не нашел ничего очень формального о разных способах расчета цвета фона, чтобы получить хороший контрастный эффект с цветом шрифта.
Итак, мой вопрос: есть ли более "формальный" подход, чтобы выбрать хороший фон, чтобы получить хороший контраст? В качестве альтернативы, как бы вы справлялись с выбором цвета фона с единственной целью сделать ваш текст максимально читаемым, каков бы ни был его цвет шрифта?
Быстрое обновление
Немного больше контекста: я просто пытаюсь показать предварительный просмотр некоторого текста (например, "Быстрая коричневая лиса прыгает по ленивой собаке" ), где пользователь выбирает цвет шрифта, вес, шрифт и т.д. Я однако интересно узнать, что можно сделать, будь то супер просто или сложнее.
Окончательное редактирование
Я решил пойти с предложением H.B.
: кажется, что он отлично работает со всеми цветами, которые я пробовал в отличие от моего предыдущего алгоритма, поскольку передний план не всегда правильно контрастирует с фоном. Мне было бы интересно узнать, есть ли формула, которая дает вам "оптимальный" фон для заданного переднего плана, но для того, что мне нужно, черно-белые работы просто прекрасны. Это мой код в его текущей форме:
public class BackgroundFromForegroundColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is Color))
return value;
Color color = (Color)value;
double Y = 0.2126 * color.ScR + 0.7152 * color.ScG + 0.0722 * color.ScB;
return Y > 0.4 ? Brushes.Black : Brushes.White;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}