2010-07-22 57 views
1

在我目前的工具中有一个彩色框,里面有一些数字。该框的背景色由某种列表定义,但也可由用户更改。 forecolor(数字的== fontcolor)不能,我想确保用户可以随时读取数字,所以我希望在背景颜色变化时随时调整数字的前景色。如何计算易于阅读的随机背景颜色?

大气压我用这样的代码:

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

但这只是针对该问题的解决方法,也有相当多的颜色(主要是黄色),导致不良阅读的显示屏。任何人都碰到类似的问题,并找到一个很好的解

回答

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; 

这将从根本上把前景色为遥远的背景颜色尽可能对面的八分之一。

+0

如果您允许使用完全彩色的文本,这可以正常工作,可惜我无法做到这一点。 – Stimpatch 2010-08-25 09:56:59

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

注意的细微调整:< = 这确保计算的颜色会变白的情况下,在一些“亲密调用“你从默认的windows颜色选择器中获得。

0

这一个完美的作品。

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