Existe um método convencional para inverter os valores do NSColor?
Estou procurando uma maneira de inverter arbitrariamenteNSColor valores em tempo de execução e não parece haver nenhum método interno para fazer isso.
Vou usar uma categoria para estenderNSColor
do seguinte modo:
NSColor * invertedColor = [someOtherColor inverted];
Aqui está o protótipo do método de categoria que estou usando:
@implementation NSColor (MyCategories)
- (NSColor *)inverted
{
NSColor * original = [self colorUsingColorSpaceName:
NSCalibratedRGBColorSpace];
return ...?
}
@end
Alguém pode preencher os espaços em branco? Isso não precisa ser perfeito, mas eu gostaria que fizesse algum sentido. ou seja:
[[[NSColor someColor] inverted] inverted]
resultaria em uma cor muito próxima da cor original
[[NSColor whiteColor] inverted]
estaria muito perto de[NSColor blackColor]
As cores invertidas estariam em lados opostos doroda de cores. (vermelho e verde, amarelo e violeta etc.)
O valor alfa deve permanecer o mesmo que o originalNSColor
. Eu só estou olhando para inverter ocor, não a transparência.
ATUALIZAÇÃO 3: (agora em cores!)
Acontece que usando umcor complementar (uma cor com um matiz a 180 ° do matiz original) não é suficiente, pois branco e preto não têm realmente um valor de matiz. A partir da resposta fornecida porphoebus, é isso que eu criei:
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]];
O tom ainda é girado em 180 °, mas também inverto o componente de brilho para que cores muito escuras se tornem muito brilhantes (e vice-versa). Isso cuida dos casos em preto e branco, mas inverte quase todas as cores em preto (o que viola minha regra de dupla inversão). Aqui estão os resultados:
amostra de cor # 1 http://img29.imageshack.us/img29/8548/invert1.jpg
Agora,A abordagem de Peter Hosey é muito mais simples e produz melhores resultados:
return [NSColor colorWithCalibratedRed:(1.0 - [original redComponent])
green:(1.0 - [original greenComponent])
blue:(1.0 - [original blueComponent])
alpha:[original alphaComponent]];
amostra de cor # 2 http://img29.imageshack.us/img29/1513/invert2.jpg
no Swift 4.2:
extension NSColor {
func inverted() -> NSColor? {
return NSColor(calibratedRed: 1.0 - redComponent,
green: 1.0 - greenComponent,
blue: 1.0 - blueComponent,
alpha: alphaComponent)
}
}