Ayer me encontré con una situación en la que necesitaba aligerar un UIColor, así que creé una categoría y agregué un método lighten
. Pensé que sería sencillo multiplicar el valor por cada componente del color, pero mis greens comenzaron a ponerse amarillos, así que sabía que tenía que ser más complicado.Aligerar un UIColor
La solución que se me ocurrió fue convertir de sRGB a Linear, multiplicar el color y luego convertir de nuevo. Esto parece funcionar, pero no estoy seguro de si es "correcto". No pude encontrar nada en los documentos que indicaran que UIColor estaba en el espacio sRGB. Tampoco soy científico del color, así que solo tengo un conocimiento rudimentario de las matemáticas involucradas.
De todos modos aquí está mi código, estoy pidiendo una revisión por pares y para ver si alguien tiene una mejor comprensión de la modificación de UIColors.
CGFloat sRGB2Linear(CGFloat x){
CGFloat a = 0.055;
if(x <= 0.04045){
return x * (1.0/12.92);
}else{
return pow((x + a) * (1.0/(1 + a)), 2.4);
}
}
CGFloat linear2sRGB(CGFloat x){
CGFloat a = 0.055;
if(x <= 0.0031308){
return x * 12.92;
}else{
return (1 + a) * pow(x, 1/2.4) - a;
}
}
- (UIColor *)lighten:(CGFloat)value{
const CGFloat *components = CGColorGetComponents([self CGColor]);
CGFloat newR = (sRGB2Linear(components[0])+1)*value;
CGFloat newG = (sRGB2Linear(components[1])+1)*value;
CGFloat newB = (sRGB2Linear(components[2])+1)*value;
newR = MAX(0, MIN(1, linear2sRGB(newR)));
newG = MAX(0, MIN(1, linear2sRGB(newG)));
newB = MAX(0, MIN(1, linear2sRGB(newB)));
return [UIColor colorWithRed:newR green:newG blue:newB alpha:components[3]];
}
Si el color es escala de grises, no funciona. – ozgur