如何计算随机背景的易读颜色?

时间:2010-07-22 09:43:36

标签: colors readability contrast

在我当前的工具中有一个彩色框,里面有一些数字。框的背景颜色由某种列表定义,但也可由用户更改。 forecolor(==字体颜色的数字)不能,我想确保用户可以随时读取数字,所以我想在背景颜色改变的任何时候调整数字的前景色。

我使用这样的代码:

if(Math.Abs(foreColor.GetBrightness() - backColor.GetBrightness()) <= 0.5f)
{
    if(foreColor.GetBrightness() > 0.5f)
    {
       foreColor = Color.Black;
    }
    else
    {
       foreColor = Color.White;
    }
}

但这只是问题的解决方法,有很多颜色(主要是黄色)会导致显示效果不佳。任何人都触及了类似的问题并找到了一个很好的解决方案?

3 个答案:

答案 0 :(得分:1)

对于每个颜色分量(假设每个分量的范围为[0,255]),如果它低于128,则将其饱和为255;否则将其归零:

fg.r = bg.r < 128 ? 255 : 0;
fg.g = bg.g < 128 ? 255 : 0;
fg.b = bg.b < 128 ? 255 : 0;

这实际上将前景色尽可能地放在与背景颜色相对的八分圆中。

答案 1 :(得分:0)

这是另一种方法,只使用黑色和白色作为前景:

foreColor = Color.Black;
int changeToWhite = 0;
if(backColor.R <= 128)
{
    changeToWhite++;
}
if(backColor.G <= 128)
{
    changeToWhite++;
}
if(backColor.B <= 128)
{
    changeToWhite++;
}
if(changeToWhite > 1)
{
    foreColor = Color.White;
}

注意稍微调整:&lt; = 这样可以确保在从默认的窗口颜色选择器获得的某些“近距离调用”中,计算出的颜色将为白色。

答案 2 :(得分:0)

这个完美无缺。

gray = ((backColor.R*38 + backColor.G*75 + backColor.B*15) >> 7);
foreColor = gray < 128 ? Color.White : Color.Black;