如何转换颜色?

时间:2018-03-17 11:21:55

标签: ios swift colors comparison

我想做一些特殊的颜色比较。 在我的研究中,我发现不应该使用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%! :○

1 个答案:

答案 0 :(得分:0)

为了比较颜色,从而执行颜色差异,您需要使用感知统一的颜色空间。

HSL HSV 实际上是非常差的色彩空间,它们不应该用于正确的色度计算,因为它们的亮度轴不是 Luminance 的实际感知表示,与 CIE L*a*b* CIE L*u*v*

有多种方法可以计算色彩科学中的色差,通常最简单的方法和假设你使用均匀色彩空间的方法是欧氏距离。

DeltaE CIE 1976 使用 CIE L * a * b * 色彩空间。 CIE注意到一些具有低 DeltaE 值的颜色实际上看起来非常不同,这是 CIE L * a * b * 颜色空间的副作用,感觉不够均匀。从那时起,研究产生了许多新的色差公式和新的感知均匀色彩空间。

这是一个从最旧到最新的显着色差公式和感知统一色彩空间的非详尽列表,请注意实现复杂性几乎遵循列表顺序:

我建议看看像 ICTCP JzAzBz 这样的东西,它们提供了良好的性能,并且实现起来并不是非常复杂,或者至少使用 CIE L * a * b * 与欧氏距离,但避免使用 HSL HSV

我们在Colour中提到了所有内容的参考实现。