Domanda

Sto cercando un modo per invertire l'arbitrario NSColor valori in fase di esecuzione e non sembra esserci alcun metodo integrato per farlo.

Utilizzerò una categoria per estendere NSColor come segue:

NSColor * invertedColor = [someOtherColor inverted];

Ecco il prototipo del metodo di categoria che sto utilizzando:

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

Qualcuno può riempire gli spazi vuoti?Non deve essere perfetto, ma vorrei che avesse un senso.cioè.:

  1. [[[NSColor someColor] inverted] inverted] risulterebbe in un colore molto vicino al colore originale

  2. [[NSColor whiteColor] inverted] sarebbe molto vicino a [NSColor blackColor]

  3. I colori invertiti sarebbero sui lati opposti del ruota dei colori.(rosso e verde, giallo e viola, ecc.)

Il valore alfa dovrebbe rimanere lo stesso dell'originale NSColor.Sto solo cercando di invertire il colore, non la trasparenza.

AGGIORNAMENTO 3: (ora a colori!)

Si scopre che utilizzando a colore complementare (un colore con una tonalità distante 180° dalla tonalità originale) non è sufficiente, poiché il bianco e il nero non hanno realmente un valore di tonalità.Partendo dalla risposta fornita da Febo, questo è quello che mi è venuto in mente:

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 tonalità viene ancora ruotata di 180°, ma inverto anche la componente di luminosità in modo che i colori molto scuri diventino molto luminosi (e viceversa).Questo si prende cura dei casi in bianco e nero, ma inverte quasi tutti i colori in nero (il che viola la mia regola della doppia inversione).Ecco i risultati:

color swatch #1

Ora, L'approccio di Peter Hosey è molto più semplice e produce risultati migliori:

return [NSColor colorWithCalibratedRed:(1.0 - [original redComponent])
                                 green:(1.0 - [original greenComponent])
                                  blue:(1.0 - [original blueComponent])
                                 alpha:[original alphaComponent]];

color swatch #2

in Swift 4.2:

extension NSColor {

    func inverted() -> NSColor? {
        return NSColor(calibratedRed: 1.0 - redComponent,
                               green: 1.0 - greenComponent,
                               blue: 1.0 - blueComponent,
                               alpha: alphaComponent)
    }
} 
È stato utile?

Soluzione

Semplice:I componenti sono tutti 0–1, quindi sottrai ciascun componente da 1 per ottenere il valore del complemento.

Esempi:

  • Rosso = 1, 0, 0;complemento = 0, 1, 1 = ciano
  • Giallo = 1, 1, 0;complemento = 0, 0, 1 = blu
  • Bianco = 1, 1, 1;complemento = 0, 0, 0 = nero
  • Arancione intenso = 1, 0,25, 0;complemento = 0, 0,75, 1 = azzurro

Come puoi immaginare, questa è un'operazione simmetrica.Invertire l'inverso ti porterà esattamente il colore con cui hai iniziato.

Altri suggerimenti

Da quello che descrivi, sembra che quello che vuoi veramente sia una funzione per trovare il complemento di un colore, non il suo inverso.Invertire significa qualcosa di diverso in questo contesto.

Ecco una domanda StackOverflow relativa ai complementi in JavaScript.Forse parte del codice è adattabile?

Qui sono alcune informazioni interessanti e potenzialmente utili sui vari modi in cui è possibile lavorare con il colore negli spazi colore Cocoa.Da come appare qui, se puoi usare lo spazio colore HSV, allora il complementare di un colore potrebbe essere trovato semplicemente prendendo hue > 179 ? hue -= 180 : hue = += 180, poiché le tonalità sono definite attorno alla ruota dei colori in un cerchio completo.

Ecco alcuni oneliner con setter personalizzato (alfa non è invertito!):

-(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)];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top