Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何转换颜色?_Ios_Swift_Colors_Comparison - Fatal编程技术网

Ios 如何转换颜色?

Ios 如何转换颜色?,ios,swift,colors,comparison,Ios,Swift,Colors,Comparison,我想做一些特殊的颜色比较。 在我的研究过程中,我发现不应该使用RGB光谱进行比较,因为一些不同的光谱,如被设计成“与人类视觉感知颜色属性的方式更紧密地一致”(引用维基百科) 所以我需要一种方法将不同的配色系统相互转换 对于我来说,最重要的转换之一是将十六进制转换为HSL(使用Swift) 因为我是一个该死的初学者,到目前为止,我只有这段代码: // conversion HEX to HSL HexToHSL("#F23CFF") // HSL should be "HSL: 296° 100

我想做一些特殊的颜色比较。 在我的研究过程中,我发现不应该使用RGB光谱进行比较,因为一些不同的光谱,如被设计成“与人类视觉感知颜色属性的方式更紧密地一致”(引用维基百科)

所以我需要一种方法将不同的配色系统相互转换

对于我来说,最重要的转换之一是将十六进制转换为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的颜色转换将非常感谢,提前感谢

注意:还有一种用于某种颜色转换的方法。也许这会有帮助。
:)

编辑:我已将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 ];
}
func-RgbToHSL(rgb:[Int])->[Double]{
设r=Double(rgb[0])/255,g=Double(rgb[1])/255,b=Double(rgb[2])/255;
设max=[r,g,b].max(),min=[r,g,b].min()!;
var h=双(最大+最小)*0.5,
s=双倍(最大+最小)*0.5,
l=双倍(最大+最小)*0.5;
如果(最大=最小){
h=0
s=0
l=0
}否则{
设d=max-min;
s=l>0.5?d/(2-最大-最小):d/(最大+最小);
开关(最大值){
案例r:h=(g-b)/d+(g

。。。但是,
rgb=[242,60255]
的结果将是
[0.822223,1.0,0.61764705882352944]
--看起来并不好,因为它应该是
296°100%62%
:o

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

实际上是非常糟糕的颜色空间。因此,不应将它们用于正确的色度计算,因为它们的亮度和值轴不是与等颜色空间相反的亮度的实际感知表示

在颜色科学中,计算色差有多种方法,通常最简单的方法是欧几里德距离,假设你使用的是均匀的颜色空间

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

下面是一个从最早到最新的值得注意的色差公式和感知一致的颜色空间的非详尽列表,请注意,实现复杂性几乎遵循列表顺序:

  • &
我建议看一下像ICTCP或JzAzBz这样的东西,它们提供了良好的性能,并且实现起来不是超级复杂,或者至少使用带有欧几里德距离的CIE L*a*b*,但避免使用HSLHSV


这里提到的所有内容我们都有参考实现。

[0.822223,1.0,0.61764705882352944]
是正确的结果,值只是缩放到0.0…1.0的范围。例如,296/360是0.8222。