Seleccionar automáticamente un color de primer plano basado en un color de fondo

¿Cuál es la "fórmula" apropiada para un color de primer plano basado en un color de fondo (donde el color de fondo puede ser cualquier color)?

Más información:

Quiero que mi aplicación seleccione un color de primer plano basado en un color de fondo (sólido y uniforme). Estaba pensando en la línea de: negro si el total de los componentes RGB es superior a (255x3)/2, y blanco en caso contrario. Pero preferiría obtener la opinión de los expertos. ¿Hay una forma aceptada de hacer esto? ¿O qué sugerirías?

Hay una pregunta similar pero las respuestas básicamente ofrecen limitar los colores de fondo disponibles. Esa no es una opción en este caso.

Voto para cerrar esta pregunta como fuera de tema porque no parece tratarse de diseño gráfico, sino de programación.
@Scott Se trata de diseño gráfico: ¿cuál es el color de primer plano apropiado en función de un color de fondo? Eso es todo. Lo de RGB es solo para poner algo de contexto a su alrededor que podría ser útil para una posible respuesta. No estoy pidiendo ayuda para programar, ese es mi trabajo. (Y es trivial en este caso).
@Scott He editado la pregunta ahora para aclararlo.
Todavía parece que se trata de programar una aplicación para mí ... pero solo tengo 1 voto ... así que solo vea lo que piensan otros usuarios. En todo caso, es un posible duplicado de esto: graphicdesign.stackexchange.com/questions/19/… o esto: graphicdesign.stackexchange.com/questions/9094/…
No estoy seguro si entiendo la pregunta, pero si esto puede ayudarlo de alguna manera, tal vez pueda encontrar pistas en la especificación de color de desarrollo de Google para aplicaciones (creo). Esa guía ya contiene instrucciones a prueba de balas para el fondo frente a otros elementos de su interfaz y, por lo general, muy buen contraste. En general, usar un 20-30 % con un 100 % ofrece un buen contraste y legibilidad (el 50 % no es suficiente para el contraste). Para la impresión, es mejor ceñirse al 10 % para los elementos de fondo con el 100 % del texto encima. google.com/design/spec/style/color.html Espero tener sentido.
Esta es una cuestión de opinión. ¿Cuánto contraste quieres? Como señaló @go-meek, difiere entre impresión y pantalla. Luego hay una cuestión de Hue que es aún más abierta a la opinión.
Puede encontrar su respuesta en una de estas preguntas sobre la experiencia del usuario : 1 , 2

Respuestas (2)

Respondí una pregunta similar en Game Development Stack Exchange hace un tiempo, así que permítanme resumir las respuestas allí.

Tu idea de elegir entre blanco o negro, dependiendo de cuál contraste mejor con el color de fondo, es acertada. Sin embargo, el simple hecho de promediar los componentes RGB no dará una buena indicación de qué tan claro aparecerá un color en particular para el ojo humano, (principalmente) por dos razones:

En primer lugar, por razones relacionadas con la percepción humana del color, los canales rojo, verde y azul no tienen la misma luminancia relativa ; de hecho, el azul puro ( #0000ff) tiene solo un 10 % de brillo (y el rojo puro solo un 30 % de brillo) que el verde puro ( #00ff00). Por lo tanto, por ejemplo, el texto negro sobre azul puro nunca tendrá un contraste particularmente bueno.

Por ejemplo, las siguientes imágenes muestran ejemplos de texto en blanco y negro sobre fondos rojos, verdes y azules puros ( #ff0000, #00ff00y #0000ff):

Texto en blanco y negro sobre rojo RGB puro Texto en blanco y negro sobre verde RGB puro Texto en blanco y negro sobre azul RGB puro

Puede ver claramente las diferencias de contraste, aunque todos estos colores tienen el mismo valor RGB promedio.

La otra complicación es que los espacios de color RGB que normalmente se usan en las pantallas de las computadoras (como sRGB ) no son lineales, sino que tienen una gamma de visualización de aproximadamente 2. Eso significa que, por ejemplo, el color RGB #7f7f7f= "50 % gris" en realidad no parece la mitad de brillante que el blanco puro ( #ffffff), sino que solo tiene un 25 % de brillo, mientras que el color que en realidad tiene una luminosidad relativa a mitad de camino entre el blanco y el negro es en realidad más cerca de "75% gris" ( #bfbfbf).

Sin embargo, convenientemente, el ojo humano tampoco es lineal y es más sensible a las diferencias en los tonos más oscuros. De hecho, para los tonos de gris, las no linealidades se anulan aproximadamente, de modo que el gris RGB al 50 % ( #7f7f7f) todavía está perceptiblemente a la misma distancia del blanco y el negro. Como demostración, aquí hay texto en blanco y negro sobre fondos grises al 25 %, 50 % y 75 % ( #3f3f3f, #7f7f7fy #bfbfbf):

Texto en blanco y negro sobre gris al 25 % Texto en blanco y negro sobre gris al 50 % Texto en blanco y negro sobre gris al 75 %

Sin embargo, para calcular con precisión la luminosidad de un color RGB arbitrario, debemos tener en cuenta la gamma de la pantalla, ya que son los valores de luminosidad lineal los que deben promediarse.

Para ponerlo todo junto, para determinar si el texto en blanco o negro tendría mejor contraste en un fondo, necesita:

  1. convertir los valores de color RGB comprimidos con gamma en RGB lineal,
  2. tomar un promedio ponderado de los componentes lineales R, G y B, y
  3. compare el promedio resultante con un umbral adecuado.

El valor de umbral que da mejores resultados puede determinarse experimentalmente, pero generalmente se esperaría que esté cerca de la luminancia del 50 % de gris RGB. En cualquier caso, vale la pena señalar que el contraste percibido variará según la configuración de visualización del espectador y las condiciones de visualización, por lo que no existe un único valor óptimo para todos, sino una gama bastante amplia de opciones más o menos igualmente buenas.

Si solo desea una fórmula simple para conectar números, intente esto:

  • si 0.2126 × R γ + 0.7152 × G γ + 0.0722 × B γ > 0.5 γ , elija negro; si no elige blanco,

donde γ es el valor gamma de visualización aproximado ( γ = 2,2 es típico).

Para una aproximación aún más simple, puede ignorar la corrección gamma (es decir, asumir efectivamente que γ = 1) y simplemente usar la condición 0.2126 × R + 0.7152 × G + 0.0722 × B > 0.5. Para los tonos de gris, esto no supondrá ninguna diferencia (ya que estamos aplicando la misma gamma a ambos lados de la desigualdad), pero sobrestima un poco la luminancia de los colores saturados. Afortunadamente, en tales colores, tanto el blanco como el negro tienden a tener un contraste decente de todos modos, por lo que el error puede no importar mucho en la práctica.

Finalmente, tenga en cuenta que, si el color de fondo no es uniforme, es posible que ningún color de texto se vea bien. En tales casos, puede considerar, por ejemplo, usar texto negro con un contorno blanco, o viceversa, o quizás rodear el texto con un cuadro semitransparente del color opuesto.

Cada color tiene tres variables; tono, saturación y brillo.

La clave para la legibilidad es el contraste, que se puede optimizar para cada una de las tres variables independientes entre sí.

Por ejemplo; el contraste de tono se puede optimizar encontrando su complemento. El contraste de saturación se puede optimizar eligiendo opuestos para cada fondo. Del mismo modo, brillante puede contrastarse con tenue.

Esto (los criterios anteriores) se refiere a una sola fórmula de selección: legibilidad óptima.

Puede haber otras consideraciones; estéticas, perceptivas, técnicas, etc.

Un medio práctico de proporcionar esta capacidad ha sido utilizar un resultado predeterminado, predecible y aceptable mediante el uso de una tabla de búsqueda de colores que proporciona un conjunto dado uno de los dos. Por ejemplo; dado el primer plano de X, se proporciona un fondo de Y. Dado un primer plano de Y, se proporciona un fondo de X. El CLUT puede ser tan complejo o completo como se desee para la aplicación en particular.

Una vez que se conocen los valores, se puede automatizar su selección.