Я ищу способ инвертировать произвольные значения NSColor во время выполнения, и для этого не существует встроенного метода.Существует ли обычный метод инвертирования значений NSColor?
Я буду использовать категорию, чтобы расширить NSColor
следующим образом:
NSColor * invertedColor = [someOtherColor inverted];
Вот метод категории прототип, который я использую:
@implementation NSColor (MyCategories)
- (NSColor *)inverted
{
NSColor * original = [self colorUsingColorSpaceName:
NSCalibratedRGBColorSpace];
return ...?
}
@end
Можно ли заполнить пробелы? Это не должно быть совершенным, но я хотел бы, чтобы это имело какой-то смысл. т.е .:
[[[NSColor someColor] inverted] inverted]
приведет к цвету очень близко к оригиналу цвета[[NSColor whiteColor] inverted]
будет очень близко к[NSColor blackColor]
инвертированные цвета будут на противоположных сторонах color wheel. (Красный & зеленый, желтый & фиолетовый, и т.д.)
Значение альфа должны оставаться такими же, как оригинал NSColor
. Я только ищу инвертировать цвет, а не прозрачность.
UPDATE 3: (! Теперь в цвете)
Оказывается, что с помощью complementary color (цвета с оттенком 180 ° от исходного оттенка) не вполне достаточно, так как белые и черный цвет действительно не имеет значения оттенка. Начиная с ответом, phoebus, это то, что я придумал:
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]];
оттенок еще поворачивается на 180 °, но я также инвертировать компонент яркости, так что очень темные цвета становятся очень яркий (и наоборот). Это позаботится о черно-белых случаях, но оно инвертирует почти каждый цвет в черный (что нарушает мое правило с двойной инверсией). Вот результаты:
color swatch #1 http://img29.imageshack.us/img29/8548/invert1.jpg
Теперь Peter Hosey's approach гораздо проще, и это дает лучшие результаты:
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
Упрощенный за то, что он прост в этом :) – phoebus
Примечание: для серого = 0,5, 0,5, 0,5; дополнение - это само по себе. – Pang