我想做一些特殊的颜色比较。 在我的研究中,我发现不应该使用RGB光谱进行比较,因为一些不同的幽灵,如HSL和HSV,旨在"更紧密地与人类视觉感知颜色属性的方式保持一致"(引用维基百科)。
所以我需要一种方法来将不同的颜色系统相互转换。
对于我而言,最重要的转换之一是将十六进制转换为 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]
}
任何帮助如何修复从十六进制到 HSL 的颜色转换将不胜感激,提前感谢!
注意:还有一个用于某种颜色转换的javascript示例。也许这对:)
有帮助
编辑:我已经将 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
为了比较颜色,从而执行颜色差异,您需要使用感知均匀的色彩空间。
HSL和HSV实际上是非常差的色彩空间,它们不应该用于正确的比色计算,因为它们的亮度和值轴不是亮度的实际感知表示,与CIE L*a*b*和CIE L*u*v*等色彩空间相反。
在色彩科学中有多种计算色差的方法,通常是最简单的,假设你使用均匀色彩空间的是欧几里得距离。
这就是DeltaE CIE 1976使用CIE L*a*b*色彩空间所做的。CIE注意到一些具有低DeltaE值的颜色实际上看起来非常不同,这是CIE L*a*b*色彩空间在感知上不够均匀的副作用。从那里开始,研究产生了许多新的色差公式和新的感知均匀的色彩空间。
以下是从最旧到最新的显着色差公式和感知均匀的色彩空间的非详尽列表,请注意实现复杂性几乎遵循列表顺序:
- DeltaE CIE 1976
- 台达 CMC
- 台达 CIE 1994
- 迪恩99
- IPT
- 台达 CIE 2000
- CIECAM02 & CAM02-UCS CAM16
- 和 CAM16-UCS
- 国际理论物理中心(英语:ICTCP )
- JzAzBz
我建议看看像ICTCP或JzAzBz这样的东西,它们提供了良好的性能,实现起来不是很复杂,或者至少使用具有欧几里得距离的CIE L*a*b*,但避免使用HSL和HSV。
我们有 Color 中提到的所有内容的参考实现。