Je dois déterminer si un UIColor sélectionné (choisi par l'utilisateur) est sombre ou clair, afin que je puisse changer la couleur d'une ligne de texte qui se trouve au-dessus de cette couleur, pour une meilleure lisibilité.
Voici un exemple en Flash / Actionscript (avec démo): http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173
Des pensées?
Bravo, André
METTRE À JOUR
Merci aux suggestions de tous, voici le code de travail:
- (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");
}
}
Encore merci :)
Réponses:
Le W3C propose les éléments suivants: http://www.w3.org/WAI/ER/WD-AERT/#color-contrast
Si vous ne faites que du texte noir ou blanc, utilisez le calcul de luminosité des couleurs ci-dessus. S'il est inférieur à 125, utilisez du texte blanc. S'il est supérieur ou égal à 125, utilisez du texte noir.
edit 1: biais vers le texte noir. :)
edit 2: La formule à utiliser est ((valeur rouge * 299) + (valeur verte * 587) + (valeur bleue * 114)) / 1000.
la source
NSArray *components = (NSArray *)CGColorGetComponents([UIColor CGColor]);
pour obtenir un tableau des composants de couleur, y compris l'alpha. Les documents ne spécifient pas dans quel ordre ils sont, mais je suppose que ce serait rouge, vert, bleu, alpha. De plus, d'après la documentation, "la taille du tableau est supérieure d'un au nombre de composants de l'espace colorimétrique pour la couleur". - ça ne dit pas pourquoi ...Voici une extension Swift (3) pour effectuer cette vérification.
Cette extension fonctionne avec les couleurs en niveaux de gris. Cependant, si vous créez toutes vos couleurs avec l'initialiseur RVB et n'utilisez pas les couleurs intégrées telles que
UIColor.black
etUIColor.white
, vous pouvez éventuellement supprimer les vérifications supplémentaires.Tests:
Remarque: mise à jour vers Swift 3 7/12/18
la source
components[0]
. Comme ça:let componentColorX: CGFloat = components[1]
En utilisant la réponse d'Erik Nedwidek, j'ai trouvé ce petit extrait de code pour une inclusion facile.
la source
UIColor whiteColor, grayColor, blackColor
.Swift3
la source
Version Swift 4
la source
Ma solution à ce problème dans une catégorie (tirée d'autres réponses ici). Fonctionne également avec les couleurs en niveaux de gris, ce qu'aucune des autres réponses ne fait au moment de la rédaction.
la source
Extension Swift 3 plus simple:
la source
Si vous préférez la version bloc:
la source
Pour tout ce qui n'est pas grisâtre, l'inverse RVB d'une couleur est généralement très contrasté avec elle. La démo inverse simplement la couleur et la désature (la convertit en gris).
Mais générer une belle combinaison de couleurs apaisante est assez compliqué. Regarder :
http://particletree.com/notebook/calculating-color-contrast-for-legible-text/
la source
La méthode suivante consiste à trouver la couleur claire ou foncée en langage Swift basé sur la couleur blanche.
La méthode suivante consiste à trouver la couleur claire ou foncée dans Swift à l'aide de composants de couleur.
la source
Pour moi, n'utiliser que CGColorGetComponents n'a pas fonctionné, j'obtiens 2 composants pour UIColors comme le blanc. Je dois donc d'abord vérifier l'espace colorimétrique du modèle. C'est ce que j'ai trouvé qui a fini par être la version rapide de la réponse de @ mattsven.
Espace colorimétrique pris à partir d'ici: https://stackoverflow.com/a/16981916/4905076
la source
UIColor a la méthode suivante pour convertir en espace colorimétrique HSB :
la source
Swift 5
Version ajoutée :la source
UIColor
s'agit d'une couleur en niveaux de gris. Une couleur RVB aléatoire ne fonctionnera pas avec ce code.Si vous voulez trouver la luminosité de la couleur, voici un pseudo code:
S'il est> 0,5, il est clair, sinon sombre.
la source