Как выбрать цвет фона в зависимости от цвета шрифта, чтобы обеспечить надлежащий контраст

Я мало знаю о цветовой композиции , поэтому я придумал этот алгоритм, который будет выбирать цвет фона на основе цвета шрифта на основе проб и ошибок:

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();
    }
}

Я немного погуглил, но Я не нашел ничего формального о различных способах расчета цвета фона для получения хорошего контрастного эффекта с цветом шрифта.

Итак, мой вопрос: существует ли более «формальный» подход к выбору хорошего фона. получить хороший контраст? В качестве альтернативы, как бы вы справились с выбором цвета фона с единственной целью сделать ваш текст максимально читаемым, независимо от цвета шрифта?

Быстрое обновление

Немного подробнее: я просто пытаюсь показать предварительный просмотр какой-то текст (например, «Быстрая коричневая лиса перепрыгивает через ленивую собаку»), где пользователь выбирает цвет шрифта, толщину, шрифт и т. д. Однако мне интересно посмотреть, что можно сделать, будь то супер-простой или более сложный.

Окончательное редактирование

Я решил использовать то, что HB предложено: похоже, он отлично работает со всеми цветами, которые я пробовал, в отличие от моего предыдущего алгоритма, где передний план не всегда правильно контрастировал с фоном.Мне было бы любопытно узнать, есть ли формула, которая дает вам «оптимальный» фон для данного переднего плана, но для того, что мне нужно, черный / белый отлично работает. Это мой код в его нынешнем виде:

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();
    }
}
17
задан 22 July 2011 в 17:59
поделиться