2013-02-28 60 views
11

讓我給你看一些獲得三個UIColors的色調,飽和度和亮度的結果。爲什麼[UIColor whiteColor]和blackColor的亮度相同

[[UIColor redColor] getHue:&hue 
       saturation:&saturation 
       brightness:&brightness 
       alpha:&alpha]; 

hue = 1.0 saturatino = 1.0 brightness = 1.0 alpha = 0.0 

[[UIColor whiteColor] getHue:&hue 
        saturation:&saturation 
        brightness:&brightness 
         alpha:&alpha]; 

hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0 

[[UIColor blackColor] getHue:&hue 
        saturation:&saturation 
        brightness:&brightness 
         alpha:&alpha]; 

hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0 

任何人都可以解釋爲什麼色調,飽和度,白色和黑色亮度相等?爲什麼alpha等於零?

我想在我的項目做的是通過改變其亮度從給定的顏色「暗」顏色:

亮度=亮度* 0.8;

它適用於任何顏色,但從白色產生黑色。 (雖然我會期待一個灰色)。

+0

+1大有趕超,從來沒有嘗試過這一點。 – 2013-02-28 09:03:54

+0

'saturatino'聽起來cuterino :) – 2014-04-09 14:12:11

回答

12

原因是因爲+whiteColor+blackColor都在灰度色彩空間中返回顏色,這與HSB色彩空間不兼容。因此,-getHue:saturation:brightness:alpha:實際上不會修改參數。我想你會在調用該方法之前發現它們都設置爲0.0。如果您檢查-getHue:saturation:brightness:alpha:的返回值,它會告訴您它是否成功轉換爲HSB。

+0

+1令人驚歎!從未想過這件事。 – 2013-02-28 09:03:30

+0

謝謝!那麼,是否有任何通用的方法可以從UIColor生成更深的顏色,即使它是灰度級的? getHue時是否還有其他情況:飽和度:亮度:alpha:可能返回false? – msmialko 2013-02-28 09:23:53

+1

@Moriquendi:其他顏色空間也可能無法轉換爲HSB,但我不知道iOS編程中可能會遇到多少顏色空間。最壞的情況下,您可以創建一個由您自己的數據支持的1px-by-1px的CGBitmapContext,用源顏色填充它,用大多數透明的黑色填充它,刪除上下文並讀取像素緩衝區以獲取新顏色。 – 2013-02-28 18:27:54

0

上面的Kevin Ballard給出了關於問題原因的正確答案。我在我正在處理的應用程序中有類似的要求,但我也想動態修改顏色的Alpha。爲了做到這一點,我創建了一個類別(UIColor +修改)中的一種方法(見下面的代碼)。該實現假設如果顏色不在RGB/HSB空間中,那麼您正在尋找一片白色。你應該很容易適應這個「乘」亮度。

#import "UIColor+Modify.h" 

@implementation UIColor (Modify) 
-(UIColor*)setBrightness:(CGFloat)brightness alpha:(CGFloat)alpha { 
    CGFloat hue = 0.0F; 
    CGFloat saturation = 0.0F; 

    [self getHue:&hue saturation:&saturation brightness:nil alpha:nil]) 

    // if the above fails then hue and saturation will still be 0.0F 
    // according to Apple's documentation <1> 

    return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha]; 
} 
@end 

我後來當我想換另一種顏色的亮度和阿爾法使用此方法:

#import "UIColor+Modify.h" 
... 
UIColor brightColor = [UIColor redColor]; 
UIColor lessBrightSeeThroughColor = [someColor setBrightness:0.9F alpha 0.8F]; 
.... 

< 1>UIColor documentation

相關問題