119 votes

Vérifier si UIColor est sombre ou lumineux?

J'ai besoin de déterminer si un choisi UIColor (choisi par l'utilisateur) est sombre ou lumineux, si je peux changer la couleur d'une ligne de texte qui se trouve en haut de cette couleur, pour une meilleure lisibilité.

Voici un exemple en Flash/Actionscript (avec démonstration): http://theflashblog.com/?p=173

Toutes les pensées?

Cheers, Andre

Mise à JOUR

Merci pour les suggestions de tout le monde, voici le code qui fonctionne:

- (void) updateColor:(UIColor *) newColor
{
    const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);

    CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
    if (colorBrightness < 0.5)
    {
        NSLog(@"my color is dark");
    }
    else
    {
        NSLog(@"my color is light");
    }
}

Merci encore une fois :)

80voto

Erik Nedwidek Points 3645

Le W3C est la suivante: http://www.w3.org/WAI/ER/WD-AERT/#color-contrast

Si vous êtes seulement à faire le noir ou le blanc du texte, utilisez la luminosité de la couleur de calcul ci-dessus. Si elle est inférieure à 125, utilisez du texte blanc. Si elle est de 125 ou au-dessus, l'utilisation de texte en noir.

edit 1: biais vers le texte en noir. :)

edit 2: La formule à utiliser est la ((valeur de Rouge * 299) + (valeur Verte * 587) + (valeur de Bleu * 114)) / 1000.

34voto

Remy Vanherweghem Points 2146

À l'aide de Erik Nedwidek réponse, je suis venu avec ce petit bout de code pour faciliter l'inclusion.

-(UIColor *)readableForegroundColorForBackgroundColor:(UIColor*)backgroundColor {

    const CGFloat *componentColors = CGColorGetComponents(backgroundColor.CGColor);

    CGFloat darknessScore = (((componentColors[0]*255) * 299) + ((componentColors[1]*255) * 587) + ((componentColors[2]*255) * 114)) / 1000;

    if (darknessScore >= 125) {
        return [UIColor blackColor];
    }

    return [UIColor whiteColor];
}

2voto

rep_movsd Points 2526

Pour tout ce qui n'est pas gris, RVB inverse d'une couleur est généralement très contrasté avec elle. La démo juste inverse la couleur et desaturates (convertit en gris).

Mais générant un beau apaisant combinaison de couleurs est assez compliqué. Regardez :

http://particletree.com/notebook/calculating-color-contrast-for-legible-text/

1voto

e.James Points 51680

Vous pouvez être intéressé à une question similaire que j'ai demandé à un moment de retour. Je cherchais à faire la même chose, et la réponse fournie par Peter Hosey a fait le tour pour moi.

0voto

Bryan Denny Points 12910

Si vous voulez trouver la luminosité de la couleur, voici le pseudo-code:

public float GetBrightness(int red, int blue, int green)
{
    float num = red / 255f;
    float num2 = blue / 255f;
    float num3 = green / 255f;
    float num4 = num;
    float num5 = num;
    if (num2 > num4)
        num4 = num2;
    if (num3 > num4)
        num4 = num3;
    if (num2 < num5)
        num5 = num2;
    if (num3 < num5)
        num5 = num3;
    return ((num4 + num5) / 2f);
}

Si c'est > 0.5, il est lumineux et sombre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X