2013-04-10 97 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