2010-07-22 55 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;