1

在我当前的工具中,有一个带有一些数字的彩色框。框的背景色由某种列表定义,但也可以由用户更改。前景色(==数字的字体颜色)不能,我想确保用户总是可以阅读数字,所以我想在背景色发生变化时调整数字的前景色。

Atm 我使用这样的代码:

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

但这只是该问题的一种解决方法,有很多颜色(主要是黄色)导致阅读显示不好。有人遇到过类似的问题并找到了好的解决方案吗?

4

3 回答 3

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;

这将基本上将前景色尽可能地放置在与背景色相反的八分圆中。

于 2010-07-22T09:48:25.680 回答
0

这个完美无缺。

gray = ((backColor.R*38 + backColor.G*75 + backColor.B*15) >> 7);
foreColor = gray < 128 ? Color.White : Color.Black;
于 2014-10-19T17:45:48.983 回答
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;
}

请注意细微的调整:<= 这可确保在您从默认窗口颜色选择器获得的某些“关闭调用”的情况下,计算的颜色将为白色。

于 2010-08-25T10:02:09.333 回答