从UIColor获取色调会产生错误的结果。

5

我正在执行以下操作来从 UIColor() 中检索 hue

let rgbColour = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
var hue: CGFloat = 0
var saturation: CGFloat = 0
var brightness: CGFloat = 0
var alpha: CGFloat = 0
rgbColour.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)

println("\(hue),\(saturation),\(brightness)")

输出:

1.0,1.0,1.0

根据这个链接,当RGB(红色)为1.0,0.0,0.0时,我应该得到0.0,1.0,1.0

我做错了什么吗?


4
红/绿/蓝色的取值范围是0.0到1.0,而不是0.0到255.0! - Martin R
2个回答

13

首先,UIColor中红/绿/蓝三个组件的取值范围为0.0到1.0,而不是0.0到255.0,因此你可能需要使用:

let rgbColour = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)

但即使如此,您也会得到输出1.0, 1.0, 1.0,这是正确的。 色调组件的范围从0.0到1.0,对应于色轮上从0º到360º的角度(例如,请参见HSL和HSV)。

因此,hue = 0.0hue = 1.0描述了一个相同的颜色。 如果您需要将色调分量归一化到半开区间 0.0 <= hue < 1.0,则可以使用以下方法进行归一化:

hue = fmod(hue, 1.0)

7
为了补充@Martin R的回答:
如果你想使用HSB,你需要:
1.将色相值除以360 2.使用小数表示饱和度和亮度值
例如,假设Sketch告诉你颜色值为HSB:色相:20、饱和度:72、亮度:96
在Xcode中,需要这样创建颜色:
let myAwesomeColour = UIColor(hue: 20/360, saturation: 0.72, brightness: 0.96, alpha: 1.0)

无论您使用RGB还是HSB,都是一种个人偏好。就Xcode而言,它们的结果是相同的,它们都会转换为UIColor

1
换句话说,你可以说第二条规则是将“饱和度”和“亮度”除以100。 - Crashalot
1
当然可以,但完全没有必要,你只需在数字前添加零和点即可。我是说,你也可以写成:72/100,但为什么呢? - kakubei
2
作为一种更通用的解决方案,如果变量中有动态值而不是常量,则除以100是规则的一般表达。 - Crashalot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接