S'appuyant sur ma réponse à une question similaire .
Vous devez diviser le code hexadécimal en 3 morceaux pour obtenir les intensités individuelles de rouge, vert et bleu. Chaque 2 chiffres du code représente une valeur en notation hexadécimale (base-16). Je n'entrerai pas dans les détails de la conversion ici, ils sont faciles à rechercher.
Une fois que vous avez les intensités pour les couleurs individuelles, vous pouvez déterminer l'intensité globale de la couleur et choisir le texte correspondant.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
Le seuil de 186 est basé sur la théorie, mais peut être ajusté au goût. Sur la base des commentaires ci-dessous, un seuil de 150 peut fonctionner mieux pour vous.
Edit: ce qui précède est simple et fonctionne assez bien, et semble avoir une bonne acceptation ici à StackOverflow. Cependant, l'un des commentaires ci-dessous montre que cela peut conduire à la non-conformité aux directives du W3C dans certaines circonstances. Ci-joint, je dérive une forme modifiée qui choisit toujours le contraste le plus élevé en fonction des directives. Si vous
n'avez pas besoin de vous conformer aux règles du W3C, je m'en tiendrai à la formule plus simple ci-dessus.
La formule donnée pour le contraste dans les Recommandations du W3C est (L1 + 0.05) / (L2 + 0.05)
, où L1
est la luminance de la couleur la plus claire et L2
la luminance de la plus sombre sur une échelle de 0,0 à 1,0. La luminance du noir est de 0,0 et celle du blanc de 1,0, donc la substitution de ces valeurs vous permet de déterminer celle avec le contraste le plus élevé. Si le contraste du noir est supérieur au contraste du blanc, utilisez le noir, sinon utilisez le blanc. Étant donné la luminance de la couleur que vous testez au fur et à mesure que L
le test devient:
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Cela simplifie algébriquement:
if L > sqrt(1.05 * 0.05) - 0.05
Ou environ:
if L > 0.179 use #000000 else use #ffffff
Il ne reste plus qu'à calculer L
. Cette formule est également donnée dans les lignes directrices et ressemble à la conversion de sRGB en RVB linéaire suivie de la recommandation UIT-R BT.709 pour la luminance.
for each c in r,g,b:
c = c / 255.0
if c <= 0.03928 then c = c/12.92 else c = ((c+0.055)/1.055) ^ 2.4
L = 0.2126 * r + 0.7152 * g + 0.0722 * b
Le seuil de 0,179 ne doit pas être modifié car il est lié aux directives du W3C. Si vous ne trouvez pas les résultats à votre goût, essayez la formule plus simple ci-dessus.