cocoa - ¿Existe un método convencional para invertir los valores de NSColor?
(3)
Aquí hay algunos oneliner con configurador personalizado (¡el alfa no se invierte!):
-(void)setReverseFontColor:(UIColor *)reverseFontColor {
_reverseFontColor = [AppSingleStyle reversedColorFromOriginal:reverseFontColor];
}
+(UIColor*)reversedColorFromOriginal:(UIColor*)originalColor {
return [UIColor colorWithRed:(1-CGColorGetComponents(originalColor.CGColor)[0]) green:(1-CGColorGetComponents(originalColor.CGColor)[1]) blue:(1-CGColorGetComponents(originalColor.CGColor)[2]) alpha:CGColorGetAlpha(originalColor.CGColor)];
}
Estoy buscando una manera de invertir valores de NSColor arbitrarios en tiempo de ejecución, y no parece haber ningún método incorporado para hacerlo.
NSColor
una categoría para extender NSColor
siguiente manera:
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 la rueda de color . (rojo y verde, amarillo y violeta, etc.)
El valor alfa debe permanecer igual que el NSColor
original. Solo estoy buscando invertir el color , no la transparencia.
ACTUALIZACIÓN 3: (ahora en color!)
Resulta que el uso de un color 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 por phoebus , 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, el 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)
}
}
Por lo que describe, parece que lo que realmente quiere es una función para encontrar el complemento de un color, no su inverso. Invertir significa algo diferente en este contexto.
Aquí hay una pregunta de con respecto a los complementos en JavaScript . ¿Quizás alguno de los códigos es adaptable?
Here hay información interesante y potencialmente útil sobre las diversas formas en que se puede trabajar con el color en los espacios de color Cocoa. Por lo que parece aquí, si puede usar el espacio de color HSV, entonces se puede encontrar el complemento de un color simplemente tomando un hue > 179 ? hue -= 180 : hue = += 180
hue > 179 ? hue -= 180 : hue = += 180
, ya que los tonos se definen alrededor de la rueda de color en un círculo completo.
Simple: los componentes son todos 0–1, así que resta cada componente de 1 para obtener el valor del complemento.
Ejemplos:
- Rojo = 1, 0, 0; complemento = 0, 1, 1 = cian
- Amarillo = 1, 1, 0; complemento = 0, 0, 1 = azul
- Blanco = 1, 1, 1; complemento = 0, 0, 0 = negro
- Naranja profundo = 1, 0.25, 0; complemento = 0, 0.75, 1 = azul cielo
Como puedes adivinar, esta es una operación simétrica. Invertir lo inverso te dará exactamente el color con el que comenzaste.