Ich bin auf der Suche nach einer Möglichkeit, um beliebige NSColor Werte zur Laufzeit zu invertieren, und es scheint keine eingebaute Methode dafür zu sein.Gibt es eine konventionelle Methode zur Invertierung von NSColor-Werten?
Ich werde eine Kategorie verwenden NSColor
zu verlängern, wie folgt:
NSColor * invertedColor = [someOtherColor inverted];
ist die Kategorie Methode Prototyp, ich verwende:
@implementation NSColor (MyCategories)
- (NSColor *)inverted
{
NSColor * original = [self colorUsingColorSpaceName:
NSCalibratedRGBColorSpace];
return ...?
}
@end
Kann jemand in die Lücken füllen? Das muss nicht perfekt sein, aber ich möchte, dass es einen Sinn ergibt. d.h .:
[[[NSColor someColor] inverted] inverted]
würde eine Farbe ganz in der Nähe der ursprünglichen Farbe[[NSColor whiteColor] inverted]
wäre ganz in der Nähe[NSColor blackColor]
Inverted Farben auf gegenüberliegenden Seiten der color wheel wäre. (Rot & grün, gelb & violett, usw.)
Der Alpha-Wert die gleiche wie das Original NSColor
bleiben sollte. Ich versuche nur, die Farbe zu invertieren, nicht die Transparenz.
UPDATE 3: (! Jetzt in Farbe)
Es stellt sich heraus, dass eine complementary color (aus dem ursprünglichen Farbton mit einem Farbton 180 ° weg eine Farbe) verwendet, ist nicht genug, da weiß und Schwarz hat eigentlich keinen Farbtonwert. Ausgehend von der Antwort von phoebus vorgesehen ist, ist es das, 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 noch um 180 ° gedreht wird, aber ich habe auch die Helligkeitskomponente invertieren, so dass sehr dunkle Farben sehr hell worden (und umgekehrt). Dies kümmert sich um die Schwarz-Weiß-Fälle, aber es invertiert fast jede Farbe in Schwarz (was gegen meine Doppelinversionsregel verstößt). Hier sind die Ergebnisse:
color swatch #1 http://img29.imageshack.us/img29/8548/invert1.jpg
Nun Peter Hosey's approach 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]];
color swatch #2 http://img29.imageshack.us/img29/1513/invert2.jpg
Upvoted für einfach zu sein :) – phoebus
Hinweis: Für grau = 0,5, 0,5, 0,5; Komplement ist es selbst. – Pang