J'ai rencontré un problème similaire. J'ai dû trouver une bonne méthode pour sélectionner la couleur de police contrastée pour afficher les étiquettes de texte sur les échelles de couleurs / cartes thermiques. Il devait s'agir d'une méthode universelle et la couleur générée devait être «belle», ce qui signifie qu'une simple génération de couleur complémentaire n'était pas une bonne solution - parfois, elle générait des couleurs étranges et très intenses qui étaient difficiles à regarder et à lire.
Après de longues heures de test et d'essayer de résoudre ce problème, j'ai découvert que la meilleure solution était de sélectionner la police blanche pour les couleurs "foncées" et la police noire pour les couleurs "lumineuses".
Voici un exemple de fonction que j'utilise en C #:
Color ContrastColor(Color color)
{
int d = 0;
// Counting the perceptive luminance - human eye favors green color...
double luminance = ( 0.299 * color.R + 0.587 * color.G + 0.114 * color.B)/255;
if (luminance > 0.5)
d = 0; // bright colors - black font
else
d = 255; // dark colors - white font
return Color.FromArgb(d, d, d);
}
Cela a été testé pour de nombreuses échelles de couleurs différentes (arc-en-ciel, niveaux de gris, chaleur, glace et bien d'autres) et c'est la seule méthode "universelle" que j'ai découverte.
Modifier
la formule de comptagea
en "luminance perceptive" - ça a vraiment l'air mieux! Déjà implémenté dans mon logiciel, il a fière allure.
Edit 2
@WebSeed a fourni un excellent exemple de travail de cet algorithme: http://codepen.io/WebSeed/full/pvgqEq/
Juste au cas où quelqu'un voudrait une version plus courte, peut-être plus facile à comprendre de la réponse de GaceK :
Remarque: j'ai supprimé l'inversion de la lumière valeur de (pour que les couleurs vives aient une valeur plus élevée, ce qui me semble plus naturel et c'est aussi la méthode de calcul `` par défaut '').
J'ai utilisé les mêmes constantes que GaceK à partir d' ici car elles fonctionnaient très bien pour moi.
(Vous pouvez également l'implémenter en tant que méthode d'extension à l'aide de la signature suivante:
Vous pouvez ensuite l'appeler via
foregroundColor = background.ContrastColor()
.)la source
Merci @Gacek . Voici une version pour Android:
Et une version améliorée (plus courte):
la source
1 - ...
partie et renommagea
àluminance
Ma mise en œuvre rapide de la réponse de Gacek:
la source
Javascript [ES2015]
la source
Merci pour ce post.
Pour ceux qui pourraient être intéressés, voici un exemple de cette fonction dans Delphi:
la source
C'est une réponse tellement utile. Merci pour cela!
Je voudrais partager une version SCSS:
Maintenant, découvrez comment utiliser l'algorithme pour créer automatiquement des couleurs de survol pour les liens de menu. Les en-têtes clairs obtiennent un survol plus sombre, et vice-versa.
la source
Implémentation Flutter
la source
Ugly Python si vous n'avez pas envie de l'écrire :)
la source
J'ai eu le même problème mais j'ai dû le développer en PHP . J'ai utilisé la solution de @ Garek et j'ai également utilisé cette réponse: convertir la couleur hexadécimale en valeurs RVB en PHP pour convertir le code couleur HEX en RVB.
Je le partage donc.
Je voulais utiliser cette fonction avec une couleur de fond HEX donnée, mais pas toujours à partir de '#'.
la source
En tant qu'extension Kotlin / Android:
la source
Une implémentation pour objectif-c
la source
iOS Swift 3.0 (extension UIColor):
la source
Exemple de Swift 4:
MISE À JOUR - Trouvé qui
0.6
était un meilleur banc d'essai pour la requêtela source
CGColor.components
varie en fonction de l'espace colorimétrique: par exemple,UIColor.white
lorsqu'il est converti en CGColor, il n'en a que deux:[1.0, 1.0]
représentant une couleur en niveaux de gris (entièrement blanche) avec un alpha complet. Un meilleur moyen d'extraire les éléments RVB d'un UIColor estUIColor.getRed(_ red:, green:, blue:, alpha:)
Notez qu'il existe un algorithme pour cela dans la bibliothèque de fermeture de Google qui fait référence à une recommandation w3c: http://www.w3.org/TR/AERT#color-contrast . Cependant, dans cette API, vous fournissez une liste de couleurs suggérées comme point de départ.
la source
Si vous manipulez des espaces colorimétriques pour obtenir un effet visuel, il est généralement plus facile de travailler en HSL (teinte, saturation et luminosité) qu'en RVB. Déplacer des couleurs en RVB pour donner des effets naturellement agréables a tendance à être assez difficile sur le plan conceptuel, alors que la conversion en HSL, la manipulation, puis la conversion à nouveau est plus intuitive dans le concept et donne invariablement de meilleurs résultats.
Wikipedia a une bonne introduction à HSL et au HSV étroitement lié. Et il y a du code gratuit sur le net pour faire la conversion (par exemple, voici une implémentation javascript )
La transformation précise que vous utilisez est une question de goût, mais personnellement, j'aurais pensé qu'inverser les composants Teinte et Luminosité serait certain de générer une bonne couleur à contraste élevé en première approximation, mais vous pouvez facilement opter pour des effets plus subtils.
la source
Vous pouvez avoir n'importe quel texte de teinte sur n'importe quel arrière-plan de teinte et vous assurer qu'il est lisible. Je le fais tout le temps. Il y a une formule pour cela en Javascript sur du texte lisible en couleur - STW * Comme il est dit sur ce lien, la formule est une variation du calcul d'ajustement du gamma inverse, bien qu'un peu plus gérable à mon humble avis. Les menus sur le côté droit de ce lien et ses pages associées utilisent des couleurs générées aléatoirement pour le texte et l'arrière-plan, toujours lisibles. Alors oui, c'est clairement possible, pas de problème.
la source
Une variation Android qui capture également l'alpha.
(merci @ thomas-vos)
la source
base
Version R de la réponse de @ Gacek à obtenirluminance
(vous pouvez facilement appliquer votre propre seuil)Usage:
la source
Sur la base de la réponse de Gacek et après avoir analysé l'exemple de @ WebSeed avec l' extension de navigateur WAVE , j'ai trouvé la version suivante qui choisit le texte en noir ou blanc en fonction du rapport de contraste (tel que défini dans les directives d'accessibilité du contenu Web (WCAG) 2.1 du W3C ) , au lieu de la luminance.
Voici le code (en javascript):
Un exemple de travail peut être trouvé dans ma fourchette de codepen @ WebSeed, qui ne produit aucune erreur de faible contraste dans WAVE.
la source