2013-04-10 108 views
1

我使用內置函數UIColour:- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha將RGB轉換爲HSV,但對於某些RGB,它沒有給出正確的輸出。
getHue函數返回的不正確Hue

CGFloat h,s,v,a; 
UIColor *tColor=[UIColor colorWithRed:(230.0/255.0) green:(226.0/255.0) blue:(226.0/255.0) alpha:1.0]; 
BOOL success=[tColor getHue:&h saturation:&s brightness:&v alpha:&a]; 
NSLog(@"Output-> Success:%d, hue:%f, sat:%f, value:%f, alpha:%f",success,h,s,v,a); 

實際輸出:
輸出 - >成功:1,色調:1.000000,飽和:0.017391,值:0.901961,α-:1.000000

預期輸出:
色調: 0,sat:0.017391,值:0.901961,alpha:1.000000

注意:我已經從一些在線轉換工具(例如:http://www.rapidtables.com/convert/color/rgb-to-hsv.htm)中推導出此預期輸出

你可以在色調中看到明顯的區別嗎?那麼,爲什麼Hue有這樣的差異,我怎樣才能得到我的預期產出?

回答

3

Hue in HSB or HSL測量爲圍繞彩色圓圈的度數,從0°開始以紅色開始並在360°開始迴繞至紅色;所以0°的色調與360°的色調相同。 UIColor將此範圍(0-360°)映射到值0-1(0°= 0.0,360°= 1.0)。

+0

你告訴360°= 1.0。函數給我的色調:1.0在實際輸出中,所以度數將是360,但我的預期輸出是0而不是360 – Iducool 2013-04-10 05:47:32

+0

我同意你提供的信息是正確的,但你也沒有包括如何將我的實際輸出轉換爲期望的輸出 – Iducool 2013-04-10 05:49:57

+2

作爲一二三解釋,1.0 = 360°相當於0.0 = 0°。要將色調標準化到0.0 <= hue <1.0的範圍,只需使用'hue = fmodf(hue,1.0)'。 – 2013-04-10 05:54:08

4

儘管世界其他地區的大多數人將「色調」定義爲從0到360度,但對於UIColor,其值爲0.0到1.0。

實際上,正如360度角度與幾何圖形或其他人的色調0.000相同,所以我們用UIColor的色調錶示1.000與0.000相同(根據您的喜好,小數點後的許多零位幻覺),二進制如果你願意。)

所以,你的「實際產出」和「預期產出」是相同的。在編碼過程中,將色相保持在0.000至0.999的範圍內,並將1.000更改爲0.000以避免麻煩。

+0

+1,簡單又好看的解釋 – Iducool 2013-04-10 07:02:06