我正在尋找一種方法來在運行時反轉任意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
Upvoted簡單明瞭:) – phoebus 2010-01-27 07:35:53
注意:灰色= 0.5,0.5,0.5;補充本身。 – Pang 2013-11-02 05:45:37