如何根据字体颜色选择背景颜色以获得适当的对比度

17 c# wpf fonts colors contrast

我不太了解颜色组成,所以我想出了这个算法,它将根据试验错误基础上的字体颜色选择背景颜色:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我做了一些谷歌搜索,但我没有找到任何非常正式的关于可以计算背景颜色的不同方式,以获得与字体颜色良好的对比效果.

所以我的问题是:是否有更"正式"的方法来选择良好的背景以获得良好的对比?或者,您将如何处理选择背景颜色,其唯一目的是使文本尽可能可读,无论其字体颜色如何?

快速更新

更多上下文:我只是想显示一些文本的预览(例如"快速的棕色狐狸跳过懒狗"),用户在那里选择字体颜色,重量,字体等.然而我对此感兴趣看看可以做些什么,无论是超级简单还是更复杂.

最后编辑

我决定采用所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();
    }
}
Run Code Online (Sandbox Code Playgroud)

H.B*_*.B. 18

有一些计算颜色亮度的方法,基于你可以采用黑色或白色背景,你会得到一个不错的可读性.例如,见luma

Y = 0.2126 R + 0.7152 G + 0.0722 B.

我认为如果你使用标准化的输入值(0.0 - 1.0),阈值将是0.5,但是我已经用了一段时间了...

编辑:示例转换实现草图:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    var c = (Color)value;
    var l = 0.2126 * c.ScR + 0.7152 * c.ScG + 0.0722 * c.ScB;

    return l < 0.5 ? Brushes.White : Brushes.Black;
}
Run Code Online (Sandbox Code Playgroud)

阈值实际上可能有点依赖于显示和个人偏好,我更喜欢较低的东西,导致更大的黑色背景份额.