【发布时间】:2018-03-17 11:21:54
【问题描述】:
我想做一些特殊的颜色比较。 在我的研究中,我发现不应该使用 RGB 光谱来进行比较,因为像 HSL & HSV 这样的一些不同的光谱旨在“更接近人类视觉感知颜色生成属性的方式”(引用维基百科)。
所以我需要一种将不同颜色系统相互转换的方法。
对我而言,最重要的转换之一是将 HEX 转换为 HSL(使用 Swift)
因为我是一个该死的初学者,所以到目前为止我只有这个代码:
// conversion HEX to HSL
HexToHSL("#F23CFF") // HSL should be "HSL: 296° 100% 62%"
func HexToHSL(_ hex: String) {
let rgb = HexToRgb(hex)
let r = rgb[0],
g = rgb[1],
b = rgb[2],
a = rgb[3]
}
func RgbToHSL(r: Int, g: Int, b: Int) -> [Int] {
let r = r/255, g = g/255, b = b/255;
let max = [r, g, b].max()!, min = [r, g, b].min()!;
let (h, s, l) = Double(max + min)*0.5; // "Expression type 'Double' is ambiguous without more context"
if (max == min) {
h = s = 0;
} else {
let d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
h /= 6;
}
return [ h, s, l ];
}
func HexToRgb(_ hex: String) -> [Int] {
let hex = hex.substring(fromIndex: 1)
var rgbValue:UInt32 = 0
Scanner(string: hex).scanHexInt32(&rgbValue)
let red = Int((rgbValue & 0xFF0000) >> 16),
green = Int((rgbValue & 0x00FF00) >> 8),
blue = Int(rgbValue & 0x0000FF),
alpha = Int(255.0)
return [red, green, blue, alpha]
}
任何关于如何修复从 HEX 到 HSL 的颜色转换的帮助将不胜感激,在此先感谢!
注意:还有一个javascript sample 用于某种颜色转换。或许对你有帮助:)
编辑:我已将 rgb 的代码修复为 hsl,如下所示:
func RgbToHSL(_ rgb: [Int]) -> [Double] {
let r = Double(rgb[0])/255, g = Double(rgb[1])/255, b = Double(rgb[2])/255;
let max = [r, g, b].max()!, min = [r, g, b].min()!;
var h = Double(max + min)*0.5,
s = Double(max + min)*0.5,
l = Double(max + min)*0.5;
if (max == min) {
h = 0
s = 0
l = 0
} else {
let d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
default: break;
}
h /= 6;
}
return [ h, s, l ];
}
...但是rgb = [242, 60, 255] 的结果将是[0.8222222222222223, 1.0, 0.61764705882352944]——看起来不太好,因为它应该是296° 100% 62%! :o
【问题讨论】:
-
[0.8222222222222223, 1.0, 0.61764705882352944]是正确的结果,值只是缩放到范围 0.0...1.0。例如,296/360 是 0.8222。
标签: ios swift colors comparison