2010-07-22 4 views
1

Dans mon outil actuel, il y a une boîte colorée avec quelques chiffres. La couleur de fond de la boîte est définie par une sorte de liste mais peut également être modifiée par l'utilisateur. La couleur de fond (== fontcolor des nombres) ne peut pas, et je veux m'assurer que l'utilisateur peut toujours lire les nombres, ainsi je voudrais ajuster le forecolor des nombres chaque fois que le backcolor change.Comment calculer une couleur facile à lire pour une couleur de fond aléatoire?

Atm i utiliser le code comme ceci:

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

mais c'est seulement une solution pour le problème, il y a beaucoup de couleurs (surtout) conduisant à jaunit une mauvaise pour lire l'affichage. Quelqu'un a-t-il abordé un problème similaire et trouvé une bonne solution?

Répondre

1

Pour chaque composant de couleur (en supposant une plage de [0, 255] par composant), s'il est inférieur à 128, le saturer en 255; sinon faire zéro:

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

Ce sera essentiellement placer la couleur de premier plan aussi loin dans l'octant en face de la couleur de fond que possible.

+0

Ceci fonctionne parfaitement si vous êtes autorisé à utiliser du texte entièrement coloré, malheureusement, je ne peux pas le faire. – Stimpatch

0

Voici une autre façon de le faire, tout en utilisant uniquement en noir et blanc comme forecolor:

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

Notez le léger ajustement: < = Cela garantit la couleur calculée sera blanche dans le cas des « proches appels "vous obtenez à partir du sélecteur de couleurs par défaut des fenêtres.

0

Celui-ci fonctionne parfaitement.

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