Encontré un problema similar. Tenía que encontrar un buen método para seleccionar el color de fuente contrastante para mostrar etiquetas de texto en escalas de colores / mapas de calor. Tenía que ser un método universal y el color generado tenía que ser "atractivo", lo que significa que la generación de color complementario simple no era una buena solución; a veces generaba colores extraños e intensos que eran difíciles de ver y leer.
Después de largas horas de pruebas y tratando de resolver este problema, descubrí que la mejor solución es seleccionar la fuente blanca para colores "oscuros" y la fuente negra para colores "brillantes".
Aquí hay un ejemplo de función que estoy usando 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);
}
Esto se probó para muchas escalas de colores diferentes (arco iris, escala de grises, calor, hielo y muchos otros) y es el único método "universal" que descubrí.
Editar
Cambió la fórmula de contar a
a "luminancia perceptiva", ¡realmente se ve mejor! Ya implementado en mi software, se ve muy bien.
Edit 2
@WebSeed proporcionó un gran ejemplo de trabajo de este algoritmo: http://codepen.io/WebSeed/full/pvgqEq/
En caso de que a alguien le gustaría una versión más corta, tal vez más fácil de entender, de la respuesta de GaceK :
Nota: eliminé la inversión del valor de luma (para que los colores brillantes tengan un valor más alto, lo que me parece más natural y también es el método de cálculo 'predeterminado'.
Usé las mismas constantes que GaceK desde aquí, ya que funcionaron muy bien para mí.
(También puede implementar esto como un Método de Extensión usando la siguiente firma:
Luego puede llamarlo a través de
foregroundColor = background.ContrastColor()
).fuente
Gracias @Gacek . Aquí hay una versión para Android:
Y una versión mejorada (más corta):
fuente
1 - ...
parte y cámbiale el nombrea
aluminance
Mi implementación rápida de la respuesta de Gacek:
fuente
Javascript [ES2015]
fuente
Gracias por este post
Para quien esté interesado, aquí hay un ejemplo de esa función en Delphi:
fuente
Esta es una respuesta muy útil. ¡Gracias por eso!
Me gustaría compartir una versión de SCSS:
Ahora descubriendo cómo usar el algoritmo para crear automáticamente colores de desplazamiento para los enlaces del menú. Los encabezados ligeros se oscurecen y viceversa.
fuente
Implementación de aleteo
fuente
Python feo si no tienes ganas de escribirlo :)
fuente
Tuve el mismo problema pero tuve que desarrollarlo en PHP . Utilicé la solución de @ Garek y también utilicé esta respuesta: Convertir color hexadecimal a valores RGB en PHP para convertir el código de color HEX a RGB.
Así que lo estoy compartiendo.
Quería usar esta función con el color de fondo HEX dado, pero no siempre comenzando desde '#'.
fuente
Como extensión Kotlin / Android:
fuente
Una implementación para el objetivo-c
fuente
iOS Swift 3.0 (extensión UIColor):
fuente
Swift 4 Ejemplo:
ACTUALIZACIÓN : se encontró que
0.6
era un mejor banco de pruebas para la consultafuente
CGColor.components
varía según el espacio de color: por ejemplo,UIColor.white
cuando se convierte en un CGColor, solo tiene dos: que[1.0, 1.0]
representa un color en escala de grises (en blanco) con un alfa completo. Una mejor manera de extraer los elementos RGB de un UIColor esUIColor.getRed(_ red:, green:, blue:, alpha:)
Tenga en cuenta que hay un algoritmo para esto en la biblioteca de cierre de google que hace referencia a una recomendación de w3c: http://www.w3.org/TR/AERT#color-contrast . Sin embargo, en esta API, proporciona una lista de colores sugeridos como punto de partida.
fuente
Si está manipulando espacios de color para obtener un efecto visual, generalmente es más fácil trabajar en HSL (Tono, Saturación y Luminosidad) que en RGB. Mover colores en RGB para dar efectos naturalmente agradables tiende a ser bastante difícil desde el punto de vista conceptual, mientras que la conversión a HSL, la manipulación allí, luego la conversión de nuevo es más intuitiva en el concepto e invariablemente da mejores resultados.
Wikipedia tiene una buena introducción a HSL y al HSV estrechamente relacionado. Y hay un código gratuito alrededor de la red para hacer la conversión (por ejemplo, aquí hay una implementación de JavaScript )
La transformación precisa que utilizas es cuestión de gustos, pero personalmente pensé que invertir los componentes de Tono y Luminosidad seguramente generaría un buen color de alto contraste como primera aproximación, pero puedes buscar fácilmente efectos más sutiles.
fuente
Puede tener cualquier texto de tono en cualquier fondo de tono y asegurarse de que sea legible. Lo hago todo el tiempo. Hay una fórmula para esto en Javascript en texto legible en color - STW * Como dice en ese enlace, la fórmula es una variación en el cálculo de ajuste de gamma inverso, aunque en mi humilde opinión es un poco más manejable. Los menús en el lado derecho de ese enlace y sus páginas asociadas usan colores generados al azar para texto y fondo, siempre legibles. Entonces sí, claramente se puede hacer, no hay problema.
fuente
Una variación de Android que también captura el alfa.
(gracias @ thomas-vos)
fuente
base
Versión R de la respuesta de @ Gacek para obtenerluminance
(puede aplicar su propio umbral fácilmente)Uso:
fuente
Basado en la respuesta de Gacek , y después de analizar el ejemplo de @ WebSeed con la extensión del navegador WAVE , se me ocurrió la siguiente versión que elige texto en blanco o negro según la relación de contraste (como se define en las Pautas de Accesibilidad al Contenido en la Web (WCAG) 2.1 de W3C ) , en lugar de luminancia.
Este es el código (en javascript):
Puede encontrar un ejemplo de trabajo en mi bifurcación del codepen de @ WebSeed, que produce cero errores de bajo contraste en WAVE.
fuente