【问题标题】:How to convert colors?如何转换颜色?
【发布时间】: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


【解决方案1】:

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

HSLHSV 实际上是非常差的色彩空间,它们不应该用于正确的色度计算,因为它们的亮度 em> 和 Value 轴不是 Luminance 的实际感知表示,与 CIE L*a*b*CIE L*u*v* 等色彩空间相反强>.

在色彩科学中有多种计算色差的方法,通常是最简单的,并且假设您使用的是统一色彩空间的一种方法是欧几里得距离。

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

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

我建议看看像 ICTCPJzAzBz 这样的东西,它们提供了良好的性能并且实现起来不是很复杂,或者至少使用 CIE L *a*b* 具有欧式距离,但避免使用 HSLHSV

对于Colour 中提到的所有内容,我们都有参考实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2017-08-18
    • 2015-09-22
    相关资源
    最近更新 更多