2010-01-27 49 views
18

我正在尋找一種方法來在運行時反轉任意NSColor值,並且似乎沒有任何內置方法可以這樣做。是否有反轉NSColor值的常規方法?

我將使用一個類來擴展NSColor如下:

NSColor * invertedColor = [someOtherColor inverted]; 

這裏是我使用的類中的方法原型:

@implementation NSColor (MyCategories) 
- (NSColor *)inverted 
{ 
    NSColor * original = [self colorUsingColorSpaceName: 
         NSCalibratedRGBColorSpace]; 
    return ...? 
} 
@end 

誰能填補空白?這並不一定是完美的,但我希望它有一定的意義。即:

  1. [[[NSColor someColor] inverted] inverted]將導致顏色非常接近原來的顏色

  2. [[NSColor whiteColor] inverted]會非常接近[NSColor blackColor]

  3. 反色將是對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

回答

21

簡單:組件都是0-1,所以從1中減去每個組件以獲得補數的值。

實例:

  • 紅色= 1,0,0;補體= 0,1,1 =青色
  • 黃色= 1,1,0; complement = 0,0,1 =藍色
  • 白色= 1,1,1;補碼= 0,0,0 =黑色
  • 深橙色= 1,0.25,0;補碼= 0,0.75,1 =天藍色

正如你所猜測的,這是一個對稱操作。反轉反過來會讓你開始使用

+0

Upvoted簡單明瞭:) – phoebus 2010-01-27 07:35:53

+0

注意:灰色= 0.5,0.5,0.5;補充本身。 – Pang 2013-11-02 05:45:37

3

從你的描述,這聽起來像真的是你想要的是一個函數來找到一種顏色的補充,而不是它的逆。反轉意味着在這方面有所不同。

Here's a StackOverflow question regarding complements in JavaScript。也許一些代碼是可適應的?

Here是一些有趣的和可能有用的信息,介紹了在Cocoa顏色空間中顏色的各種使用方式。從它看起來像這裏,如果您可以使用HSV色彩空間,那麼可以通過簡單地採取hue > 179 ? hue -= 180 : hue = += 180來找到色彩的補充,因爲色調是圍繞色輪在整個圓周中定義的。

+0

即Java代碼看起來很有希望。我會給它一個旋風。 – 2010-01-27 06:42:25

+0

並感謝您提供補色或倒色的觀點。我會在這個問題上加上這一點。 – 2010-01-27 06:43:10

1

下面是一些oneliner與定製的setter(阿爾法不會逆轉!):

-(void)setReverseFontColor:(UIColor *)reverseFontColor { 
    _reverseFontColor = [AppSingleStyle reversedColorFromOriginal:reverseFontColor]; 
} 

+(UIColor*)reversedColorFromOriginal:(UIColor*)originalColor { 
    return [UIColor colorWithRed:(1-CGColorGetComponents(originalColor.CGColor)[0]) green:(1-CGColorGetComponents(originalColor.CGColor)[1]) blue:(1-CGColorGetComponents(originalColor.CGColor)[2]) alpha:CGColorGetAlpha(originalColor.CGColor)]; 
} 
+0

你可能想要考慮使用const CGFloat * cc = CGColorGetComponents(originalColor.CGColor); (1-cc [0])綠色:(1-cc [1])藍色:(1-cc [2])alpha:CGColorGetAlpha(originalColor.CGColor)]; (爲什麼調用函數3次以獲得相同的結果?) – unsynchronized 2013-11-09 03:39:30