2010-04-07 63 views
1

假設我已經獲得了紅色的FF0000顏色。找到一個更深的顏色很容易,我只是鍵入可能CC而不是FF,但是假設我已經獲得了顏色AE83FC,這是一個複雜的顏色,我怎麼會發現自動更輕或更暗的版本?Objective-C RGB到HSB

我想最簡單的方式做,這是我的RGB轉換爲HSB [色調,飽和度,亮度]

我將如何做到這一點在Objective-C?

假設我有一個RGB:1.0,0.0,0.0。那是紅色的。

CGFloat r = 1.0; 
CGFloat g = 0.0; 
CGfloat b = 0.0; 

我將如何將其轉換成HSB然後變換顏色,並使其回到RGB到我可以使用CGContextRGBSetFillColor?

有沒有HSB功能?

請幫忙。 :)

回答

4

首先,請注意,三個數字不描述顏色,三個數字連同一個顏色空間。 RGB不是一個色彩空間,它就是所謂的色彩模型。 RGB模型有很多顏色空間。因此((1,0,0),sRGB)與((1,0,0),Adobe RGB)顏色不同。你知道字符串編碼是如何工作的嗎?一堆字節本身不是一個字符串?這很像。這也是類似的,因爲無論何時您想查看組件值,都會遇到麻煩,因爲這是搞亂色彩空間處理的機會。

對不起,不能幫助自己。無論如何,我會回答這個問題,就好像你的原始顏色是((1,0,0),通用RGB)。

NSColor *color = [NSColor colorWithCalibratedRed:1 green:0 blue:0 alpha:1]; 
NSLog(@"hue! %g saturation! %g brightness! %g, [color hueComponent], [color saturationComponent], [color brightnessComponent]); 

,並在另一方面,

NSColor *color = [NSColor colorWithCalibratedHue:h saturation:s brightness:b alpha:1]; 
NSLog(@"red! %g green! %g blue! %g, [color redComponent], [color greenComponent], [color blueComponent]); 

這些fooComponent方法並非適用於所有顏色的工作,只有那些在兩個特定的色彩空間,看文檔。你已經知道你很好,如果你用上面的方法自己創建顏色。如果你有一個未知來源的顏色,你可以(嘗試)將它轉換成一個顏色空間,你可以在這個顏色空間中使用這些組合方法-[NSColor colorUsingColorspaceName:]

+0

啊,真好。 :)感謝很多人。我假設整個Adobe RGB和sRGB不會是一個大問題,因爲iPhone使用了特定的顏色類型? – 2010-04-07 09:12:29

0

有沒有必要一路去HSB這一點。如果要查找較暗的顏色版本,只需將每個R,G和B分量與0到1之間的數字相乘,即可得到相同的顏色,但顏色較深。

實施例:AE83FC的半強度:

{0xAE, 0x83, 0xFC} * 0.5 = 
    {174, 131, 252} * 0.5 = 
    {87, 65, 126} = 
    {0x57, 0x41, 0x7E} => 57417E 

以相同的方式,可以通過與任何東西> 1乘以獲得更亮的版本。每個組件的值不能大於255,因此發生這種情況時,您需要將其限制爲255.這意味着該顏色不會是完全相同顏色的較亮版本,但可能足夠滿足您的需要。

+0

不錯的方法!我從來沒有想過它那樣:) – 2010-04-07 09:10:39

+0

這是一個非常粗略的近似值,並會傾向於給你明顯的顏色漂移,除了最受限制的情況 – Cruachan 2011-06-28 21:18:50