Necesito determinar si un UIColor seleccionado (elegido por el usuario) es oscuro o brillante, para poder cambiar el color de una línea de texto que se encuentra encima de ese color, para una mejor legibilidad.
Aquí hay un ejemplo en Flash / Actionscript (con demostración): http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173
¿Alguna idea?
Saludos, Andre
ACTUALIZAR
Gracias a las sugerencias de todos, aquí está el código de trabajo:
- (void) updateColor:(UIColor *) newColor
{
const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);
CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
if (colorBrightness < 0.5)
{
NSLog(@"my color is dark");
}
else
{
NSLog(@"my color is light");
}
}
Gracias una vez más :)
Respuestas:
W3C tiene lo siguiente: http://www.w3.org/WAI/ER/WD-AERT/#color-contrast
Si solo está haciendo texto en blanco o negro, use el cálculo de brillo de color anterior. Si está por debajo de 125, use texto blanco. Si es 125 o superior, use texto negro.
edición 1: sesgo hacia el texto negro. :)
edición 2: la fórmula a utilizar es ((valor rojo * 299) + (valor verde * 587) + (valor azul * 114)) / 1000.
fuente
NSArray *components = (NSArray *)CGColorGetComponents([UIColor CGColor]);
para obtener una matriz de los componentes de color, incluido el alfa. Los documentos no especifican en qué orden están, pero supongo que sería rojo, verde, azul, alfa. Además, según los documentos, "el tamaño de la matriz es uno más que el número de componentes del espacio de color para el color". - no dice por qué ...Aquí hay una extensión Swift (3) para realizar esta verificación.
Esta extensión funciona con colores en escala de grises. Sin embargo, si está creando todos sus colores con el inicializador RGB y no está usando los colores incorporados como
UIColor.black
yUIColor.white
, entonces posiblemente pueda eliminar las marcas adicionales.Pruebas:
Nota: actualizado a Swift 3 7/12/18
fuente
components[0]
. Así:let componentColorX: CGFloat = components[1]
Usando la respuesta de Erik Nedwidek, se me ocurrió ese pequeño fragmento de código para facilitar su inclusión.
fuente
UIColor whiteColor, grayColor, blackColor
.Swift3
fuente
Versión Swift 4
fuente
Mi solución a este problema en una categoría (extraída de otras respuestas aquí). También funciona con colores en escala de grises, lo que al momento de escribir ninguna de las otras respuestas lo hace.
fuente
Extensión Swift 3 más simple:
fuente
Si prefiere la versión en bloque:
fuente
Para todo lo que no es grisáceo, el inverso RGB de un color suele contrastarse mucho con él. La demostración simplemente invierte el color y lo desatura (lo convierte en gris).
Pero generar una combinación de colores agradable y relajante es bastante complicado. Mirar :
http://particletree.com/notebook/calculating-color-contrast-for-legible-text/
fuente
El siguiente método es encontrar el color claro u oscuro en el lenguaje Swift basado en el color blanco.
El siguiente método es encontrar el color claro u oscuro en Swift utilizando componentes de color.
fuente
Para mí, usar solo CGColorGetComponents no funcionó, obtengo 2 componentes para UIColors como el blanco. Así que primero tengo que comprobar el modelo de espacio de color. Esto es lo que se me ocurrió que terminó siendo la versión rápida de la respuesta de @ mattsven.
Espacio de color tomado de aquí: https://stackoverflow.com/a/16981916/4905076
fuente
UIColor tiene el siguiente método para convertir al espacio de color HSB :
fuente
Swift 5
Versión agregada :fuente
UIColor
es un color en escala de grises. Un color RGB aleatorio no funcionará con este código.Si desea encontrar el brillo del color, aquí hay un pseudocódigo:
Si es> 0,5, es brillante y, por lo demás, oscuro.
fuente