Frage

Ich bin Suche nach einem Weg zu invertieren beliebigen NSColor Werte zur Laufzeit, und es scheint keine integrierte Methode zu sein, dies zu tun.

Ich werde eine Kategorie verwenden NSColor zu verlängern, wie folgt:

NSColor * invertedColor = [someOtherColor inverted];

Hier ist die Kategorie Methode Prototyp, ich bin mit:

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

Kann jemand füllen die Lücken? Dies muss nicht perfekt sein, aber ich möchte es einen Sinn machen. das heißt:.

  1. [[[NSColor someColor] inverted] inverted] in einer Farbe führen würde, ganz in der Nähe der ursprünglichen Farbe

  2. [[NSColor whiteColor] inverted] wäre ganz in der Nähe [NSColor blackColor]

  3. invertierte Farben auf gegenüberliegenden Seiten wären des Farbrad . (Rot und grün, gelb und violett, usw.)

Der Alpha-Wert sollte der gleiche wie der ursprüngliche NSColor bleiben. Ich suche nur die Farbe invertieren , nicht die Transparenz.

UPDATE 3: (! Jetzt in Farbe)

Es stellt sich heraus, dass mit einem Komplementärfarbe (eine Farbe mit einem Farbton 180 ° weg von der ursprünglichen Farbton) ist nicht genug, da weiß und schwarz nicht wirklich einen Farbtonwert hat. Ausgehend von der Antwort zur Verfügung gestellt von phoebus , das ist, was ich kam mit:

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

Der Farbton wird gedreht, noch 180 °, aber auch I invertieren die Helligkeitskomponente so dass sehr dunkle Farben werden sehr helle (und umgekehrt). Diese kümmert sich um die schwarzen und weißen Fällen, aber es kehrt fast jeder Farbe schwarz (was meine Doppelinversionsregel verletzt). Hier sind die Ergebnisse:

Nun Peter Hosey Ansatz ist viel einfacher, und es produziert bessere Ergebnisse:

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

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)
    }
} 
War es hilfreich?

Lösung

Ganz einfach:. Die Komponenten werden alle 0-1, subtrahieren, um jede Komponente von 1 bis der Wert des Komplement erhalten

Beispiele:

  • Rot = 1, 0, 0; Komplement = 0, 1, 1 = Cyan
  • Gelb = 1, 1, 0; 0 Komplement = 0, 1 = blau
  • White = 1, 1, 1; 0 Komplement =, 0, 0 = schwarz
  • Deep orange = 1, 0,25, 0; 0 Komplement = 0,75, 1 = Himmelblau

Wie Sie sich vorstellen können, ist dies ein symmetrischer Betrieb. die inverse Invertierung erhalten Sie genau die Farbe, die Sie begann mit.

Andere Tipps

Von dem, was Sie beschreiben, klingt es wie das, was Sie wirklich wollen, ist eine Funktion, um eine Farbe Komplement zu finden, die nicht ihre Inverse. Invertiereinrichtung etwas anderes in diesem Zusammenhang.

Hier ist eine Frage Stackoverflow in Bezug auf Ergänzungen in JavaScript . einige der Code Vielleicht ist anpassungsfähig?

Hier einige interessante und potentiell nützliche Informationen über die Farbe verschiedene Art und Weise arbeitet mit in Cocoa Farbraum werden können. Von dem, was es wie hier aussieht, wenn Sie den HSV-Farbraum verwenden können, dann könnte das Komplement einer Farbe, indem man einfach hue > 179 ? hue -= 180 : hue = += 180 gefunden werden, da die Farben um das Farbrad in einem Vollkreis definiert sind.

Hier finden Sie einige oneliner mit benutzerdefinierten Setter (alpha nicht rückgängig gemacht wird!):

-(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)];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top