¿Existe un método convencional para invertir los valores de NSColor?
Estoy buscando una manera de invertir arbitrariaNSColor valores en tiempo de ejecución, y no parece haber ningún método incorporado para hacerlo.
Estaré usando una categoría para extenderNSColor
como sigue:
NSColor * invertedColor = [someOtherColor inverted];
Aquí está la categoría de prototipo de 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 que ser perfecto, pero me gustaría que tuviera algún sentido. es decir.:
[[[NSColor someColor] inverted] inverted]
daría como resultado un color muy cercano al color original
[[NSColor whiteColor] inverted]
estaría muy cerca de[NSColor blackColor]
Los colores invertidos estarían en lados opuestos de larueda de color. (rojo y verde, amarillo y violeta, etc.)
El valor alfa debe permanecer igual al original.NSColor
. Sólo estoy buscando invertir elcolor, no la transparencia.
ACTUALIZACIÓN 3: (ahora en color!)
Resulta que usar unaColor complementario (un color con un tono a 180 ° del tono original) no es suficiente, ya que el blanco y el negro no tienen realmente un valor de tono. A partir de la respuesta proporcionada porFebo, esto es lo que se me 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]];
El tono sigue girando 180 °, pero también invierto el componente de brillo para que los colores muy oscuros se vuelvan muy brillantes (y viceversa). Esto se encarga de los casos en blanco y negro, pero invierte casi todos los colores a negro (lo que viola mi regla de doble inversión). Aquí están los resultados:
muestra de color # 1 http://img29.imageshack.us/img29/8548/invert1.jpg
Ahora,Enfoque de Peter Hosey 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]];
muestra de color # 2 http://img29.imageshack.us/img29/1513/invert2.jpg
en Swift 4.2:
extension NSColor {
func inverted() -> NSColor? {
return NSColor(calibratedRed: 1.0 - redComponent,
green: 1.0 - greenComponent,
blue: 1.0 - blueComponent,
alpha: alphaComponent)
}
}