Estoy tratando de evaluar la oscuridad de un color elegido por un selector de color para ver si es "demasiado negro" y, si es así, establecerlo en blanco. Pensé que podría usar los primeros caracteres del valor hexadecimal para lograrlo. Está funcionando, pero también está cambiando algunos colores legítimamente "claros".
Tengo un código haciendo esto:
if (lightcolor.substring(0,3) == "#00"|| lightcolor.substring(0,3) == "#010"){
lightcolor="#FFFFFF";
color=lightcolor;
}
¿Debe haber una forma más eficiente con las matemáticas hexadecimales para saber que un color ha ido más allá de cierto nivel de oscuridad? Como si color claro + "algún valor hexadecimal" <= "algún valor hexadecimal", entonces póngalo en blanco.
He agregado tinyColor, que podría ser útil para esto, pero no estoy seguro.
javascript
colors
Dshiz
fuente
fuente
Respuestas:
Debe extraer los tres componentes RGB individualmente y luego usar una fórmula estándar para convertir los valores RGB resultantes en su brillo percibido.
Asumiendo un color de seis caracteres:
EDITAR
Desde mayo de 2014
tinycolor
ahora tiene unagetBrightness()
función, aunque utiliza los factores de ponderación CCIR601 en lugar de los de ITU-R anteriores.EDITAR
El rango de valores de luma resultante es 0..255, donde 0 es el más oscuro y 255 es el más claro. Los valores superiores a 128 se consideran ligeros por
tinycolor
. (copiado descaradamente de los comentarios de @ pau.moreno y @Alnitak)fuente
luma
rango de valores resultante es0..255
, donde0
es el más oscuro y255
el más claro (los tres coeficientes suman uno).isDark()
umbral está codificado en 128La biblioteca TinyColor (ya la ha mencionado) proporciona varias funciones para inspeccionar y manipular colores, entre ellas:
getBrightness
isLight
Es oscuro
getLuminance
fuente
Encontré esta función PHP de WooCommerce Wordpress ( wc_hex_is_light ) y la convertí a JavaScript. ¡Funciona bien!
fuente
Puede calcular la luminancia :
Así que es genial elegir si el texto debe ser blanco o negro.
El método anterior le permite pasar el color en diferentes formatos, pero el algoritmo es básicamente
luminance_get
.Cuando lo usé, estaba configurando el color en negro si la luminancia era mayor que
180
, blanco en caso contrario.fuente
Aquí hay una distinción importante entre luminancia y brillo. La luminancia, al final del día, es una medida de cuánta energía viaja a través de un área determinada e ignora por completo cómo nuestros sistemas de percepción perciben esa energía. El brillo, por otro lado, es una medida de cómo percibimos esa energía y tiene en cuenta la relación entre la luminancia y nuestro sistema de percepción. (Como punto de confusión, hay un término llamado luminancia relativa, que parece ser usado como sinónimo de términos de brillo. Me sorprendió mucho).
Para ser precisos, busca "brillo" o "valor" o "luminancia relativa", como han sugerido otros. Puede calcular esto de varias maneras diferentes (¡eso es ser humano!) Http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
fuente
Este trabajo con hexadecimal, por ejemplo, #fefefe
Puedes cambiarlo por volver
true
ofalse
por cambioa
fuente
Una posible solución sería convertir su color de RGB a HSB . HSB significa tono, saturación y brillo (también conocido como HSV, donde V es el valor). Entonces solo tiene un parámetro para verificar: brillo.
fuente
Me doy cuenta de que esta conversación tiene algunos años, pero sigue siendo relevante. Quería agregar que mi equipo estaba teniendo el mismo problema en Java (SWT) y encontré que esto era un poco más preciso:
fuente