Ich versuche, die Dunkelheit einer von einem Farbwähler ausgewählten Farbe zu bewerten, um festzustellen, ob sie "zu schwarz" ist, und wenn ja, setzen Sie sie auf Weiß. Ich dachte, ich könnte die ersten Zeichen des Hex-Werts verwenden, um dies zu erreichen. Es funktioniert, aber es wechselt auch einige rechtmäßige "helle" Farben.
Ich habe Code, der dies tut:
if (lightcolor.substring(0,3) == "#00"|| lightcolor.substring(0,3) == "#010"){
lightcolor="#FFFFFF";
color=lightcolor;
}
Es muss einen effizienteren Weg mit Hex-Mathematik geben, um zu wissen, dass eine Farbe einen bestimmten Grad an Dunkelheit überschritten hat? Zum Beispiel, wenn Lichtfarbe + "irgendein Hex-Wert" <= "irgendein Hex-Wert", dann setzen Sie es auf Weiß.
Ich habe tinyColor hinzugefügt, was hierfür von Nutzen sein könnte, aber ich weiß es nicht genau.
javascript
colors
Dshiz
quelle
quelle
Antworten:
Sie müssen die drei RGB-Komponenten einzeln extrahieren und dann eine Standardformel verwenden, um die resultierenden RGB-Werte in ihre wahrgenommene Helligkeit umzuwandeln.
Angenommen, eine Farbe mit sechs Zeichen:
BEARBEITEN
Seit Mai 2014 hat
tinycolor
nun einegetBrightness()
Funktion, obwohl die CCIR601-Gewichtungsfaktoren anstelle der oben genannten ITU-R-Faktoren verwendet werden.BEARBEITEN
Der resultierende Luma-Wertebereich ist 0..255, wobei 0 am dunkelsten und 255 am hellsten ist. Werte größer als 128 werden von als hell angesehen
tinycolor
. (schamlos aus den Kommentaren von @ pau.moreno und @Alnitak kopiert)quelle
luma
Wertebereich ist0..255
, wo0
der dunkelste und255
der hellste ist (die drei Koeffizienten summieren sich zu eins).isDark()
Schwellenwert ist bei 128 fest codiertDie TinyColor- Bibliothek (Sie haben sie bereits erwähnt) bietet verschiedene Funktionen zum Überprüfen und Bearbeiten von Farben, darunter:
getBrightness
ist Licht
ist dunkel
getLuminance
quelle
Ich habe diese WooCommerce Wordpress PHP-Funktion ( wc_hex_is_light ) gefunden und in JavaScript konvertiert. Funktioniert gut!
quelle
Sie können die Luminanz berechnen :
Es ist also eine gute Wahl, ob der Text weiß oder schwarz sein soll.
Mit der obigen Methode können Sie die Farbe in verschiedenen Formaten übergeben, aber der Algorithmus ist im Grunde nur in
luminance_get
.Als ich es benutzte, stellte ich die Farbe auf Schwarz ein, wenn die Luminanz größer war als
180
ansonsten Weiß.quelle
Hier gibt es einen wichtigen Unterschied zwischen Luminanz und Helligkeit. Die Luminanz am Ende des Tages ist ein Maß dafür, wie viel Energie durch einen bestimmten Bereich fließt, und ignoriert vollständig, wie unsere Wahrnehmungssysteme diese Energie wahrnehmen. Die Helligkeit hingegen ist ein Maß dafür, wie wir diese Energie wahrnehmen, und berücksichtigt die Beziehung zwischen Luminanz und unserem Wahrnehmungssystem. (Aus Verwirrung gibt es einen Begriff namens relative Luminanz, der synonym mit Helligkeitsbegriffen verwendet zu werden scheint. Er hat mich gut gestolpert).
Um genau zu sein, suchen Sie nach "Helligkeit" oder "Wert" oder "relativ Luminanz", wie andere vorgeschlagen haben. Sie können dies auf verschiedene Arten berechnen (so soll es menschlich sein!) Http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
quelle
Dies funktioniert mit hex zB #fefefe
Sie können es ändern, um zurückzukehren
true
oderfalse
durch Änderungzu
quelle
Eine mögliche Lösung wäre, Ihre Farbe von RGB in HSB zu konvertieren . HSB steht für Farbton, Sättigung und Helligkeit (auch als HSV bekannt, wobei V für Wert steht). Dann müssen Sie nur noch einen Parameter überprüfen: Helligkeit.
quelle
Mir ist klar, dass dieses Gespräch ein paar Jahre alt ist, aber es ist immer noch relevant. Ich wollte hinzufügen, dass mein Team das gleiche Problem in Java (SWT) hatte und fand dies etwas genauer:
quelle