Estoy buscando una manera de invertir valores arbitrarios NSColor en tiempo de ejecución, y no parece haber ningún método incorporado para hacerlo.¿Existe un método convencional para invertir los valores NSColor?
Me va a utilizar una categoría para extender NSColor
de la siguiente manera:
NSColor * invertedColor = [someOtherColor inverted];
Aquí está la categoría de prototipos método que estoy usando:
@implementation NSColor (MyCategories)
- (NSColor *)inverted
{
NSColor * original = [self colorUsingColorSpaceName:
NSCalibratedRGBColorSpace];
return ...?
}
@end
¿Alguien puede llenar los espacios en blanco? Esto no tiene por qué ser perfecto, pero me gustaría que tenga sentido. es decir .:
[[[NSColor someColor] inverted] inverted]
daría como resultado un color muy parecido al color original de[[NSColor whiteColor] inverted]
sería muy cerca de[NSColor blackColor]
colores invertidos sería en lados opuestos de la color wheel. (Rojo & verde, amarillo & violeta, etc.)
El valor alfa debe seguir siendo el mismo que el original NSColor
. Solo estoy buscando invertir el color, no la transparencia.
ACTUALIZACIÓN 3: (! Ahora en color)
Resulta que el uso de un (un color con una tonalidad 180 ° fuera de la tonalidad original de) complementary color no es suficiente, puesto que el blanco y negro realmente no tiene un valor de tono. A partir de la respuesta proporcionada por phoebus, esto es lo que ocurrió:
CGFloat hue = [original hueComponent];
if (hue >= 0.5) { hue -= 0.5; } else { hue += 0.5; }
return [NSColor colorWithCalibratedHue:hue
saturation:[original saturationComponent]
brightness:(1.0 - [original brightnessComponent])
alpha:[original alphaComponent]];
La tonalidad aún se gira 180 °, pero también invertir la componente de brillo para que los colores muy oscuros se vuelven muy brillante (y viceversa) Esto se ocupa de los casos en blanco y negro, pero invierte casi todos los colores en negro (lo que infringe mi regla de doble inversión). Aquí están los resultados:
color swatch #1 http://img29.imageshack.us/img29/8548/invert1.jpg
Ahora, Peter Hosey's approach es mucho más simple, y produce mejores resultados:
return [NSColor colorWithCalibratedRed:(1.0 - [original redComponent])
green:(1.0 - [original greenComponent])
blue:(1.0 - [original blueComponent])
alpha:[original alphaComponent]];
color swatch #2 http://img29.imageshack.us/img29/1513/invert2.jpg
Votado positivamente por ser simple :) – phoebus
Nota: Gris = 0.5, 0.5, 0.5; el complemento es en sí mismo. – Pang