Есть ли обычный метод для инвертирования значений 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]
Перевернутые цвета будут на противоположных сторонахцветное колесо, (красный и желто-зеленый & фиолетовый и т. д.)
Альфа-значение должно оставаться таким же, как оригиналNSColor
, Я'м только ищет, чтобы инвертироватьцвета не прозрачность.
ОБНОВЛЕНИЕ 3: (теперь в цвете!)
Оказывается, используядополнительный цвет (цвет с оттенком 180 ° от первоначального оттенка) не достаточно, так как белый и черный недействительно имеет значение оттенка. Начиная с ответа, предоставленногоФебвот что я придумал:
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 °, но я также инвертирую компонент яркости, чтобы очень темные цвета стали очень яркими (и наоборот). Это относится к черно-белым случаям, но инвертирует практически каждый цвет в черный (что нарушает мое правило двойной инверсии). Вот результаты:
образец цвета # 1 http://img29.imageshack.us/img29/8548/invert1.jpg
Сейчас,Питер Хосейподход намного проще, и это дает лучшие результаты:
return [NSColor colorWithCalibratedRed:(1.0 - [original redComponent])
green:(1.0 - [original greenComponent])
blue:(1.0 - [original blueComponent])
alpha:[original alphaComponent]];
образец цвета # 2 http://img29.imageshack.us/img29/1513/invert2.jpg
в Swift 4.2:
extension NSColor {
func inverted() -> NSColor? {
return NSColor(calibratedRed: 1.0 - redComponent,
green: 1.0 - greenComponent,
blue: 1.0 - blueComponent,
alpha: alphaComponent)
}
}