Pregunta

Estoy buscando una manera de invertir arbitraria Los valores NSColor en tiempo de ejecución, y no parece haber ningún método integrado para hacerlo.

Me va a utilizar una categoría para extender NSColor como sigue:

NSColor * invertedColor = [someOtherColor inverted];

Este es el prototipo de la categoría método que estoy usando:

@implementation NSColor (MyCategories)
- (NSColor *)inverted
{
    NSColor * original = [self colorUsingColorSpaceName:
                      NSCalibratedRGBColorSpace];
    return ...?
}
@end
cualquiera de llenado

Can los espacios en blanco? Esto no tiene que ser perfecto, pero me gustaría que tenga algún sentido. es decir:.

  1. [[[NSColor someColor] inverted] inverted] daría como resultado un color muy próximo al color original

  2. [[NSColor whiteColor] inverted] sería muy cerca de [NSColor blackColor]

  3. colores invertidos estarían en lados opuestos de la color de la rueda . (Rojo y verde, amarillo y violeta, etc.)

El valor alfa debe seguir siendo el mismo que el NSColor originales. Sólo estoy mirando para invertir la Color , no la transparencia.

Actualización 3: (! Ahora en color)

Resulta que el uso de un complementaria de color (un color con una tonalidad 180 ° lejos de la tonalidad original,) no es suficiente, puesto que el blanco y negro en realidad no tienen un valor de matiz. 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]];

el matiz es todavía hace girar 180 °, pero también invertido el componente de brillo de manera que los colores muy oscuros llegar a ser muy brillante (y viceversa). Este se encarga de los casos en blanco y negro, pero se invierte casi todos los colores a negro (que viola mi regla de doble inversión). Aquí están los resultados:

color de muestra # 1

El enfoque de

Ahora, 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]];

color de muestra # 2

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)
    }
} 
¿Fue útil?

Solución

Simple:. Los componentes están 0-1, por lo que restan cada componente del 1 al obtener el valor del complemento

Ejemplos:

  • Red = 1, 0, 0; complemento = 0, 1, 1 = cyan
  • Yellow = 1, 1, 0; complemento = 0, 0, 1 = azul
  • White = 1, 1, 1; complemento = 0, 0, 0 = negro
  • naranja intenso = 1, 0,25, 0; complemento = 0, 0,75, 1 = cielo azul

Como se puede adivinar, esta es una operación simétrica. Invirtiendo la inversa le conseguirá exactamente el color que comenzó.

Otros consejos

A partir de lo que describes, parece que lo que realmente quiere es una función para encontrar el complemento de un color, no su inversa. Invertir significa algo diferente en este contexto.

He aquí una pregunta StackOverflow respecto complementos en JavaScript . Tal vez una parte del código es adaptable?

Aquí es cierta información interesante y potencialmente útil sobre el color de varias maneras se puede trabajar con espacios de color en el cacao. A partir de lo que parece aquí, si se puede utilizar el espacio de color HSV, entonces el complemento de un color se pudo encontrar simplemente tomando hue > 179 ? hue -= 180 : hue = += 180, ya que las tonalidades se definen en torno a la rueda de colores en un círculo completo.

Aquí hay alguna oneliner con colocador personalizado (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)];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top