斯威夫特 | 使用 HSL 颜色空间代替标准 HSB/HSV

Mof*_*waw 3 colors uicolor ios swift swiftui

我目前正在开发 HSL 颜色选择器,它需要 HSL 颜色空间。

但根据我的发现,两者UIColorColor只能用 来初始化brightness,而不是lightness我需要的。

有没有一种方法可以使用 HSL 颜色空间而不是默认的 HSB/HSV 颜色空间?

请问,从 HSB 转换为 HSL 的最佳实践是什么?

谢谢你!

Mof*_*waw 8

您可以简单地创建一个 HSL 颜色空间初始值设定项。

注意:该//From HSL TO HSB ---------部分内的公式取自https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_HSV

实施如下:

UIColor

import UIKit 

extension UIColor {
    convenience init(hue: CGFloat, saturation: CGFloat, lightness: CGFloat, alpha: CGFloat) {
        precondition(0...1 ~= hue &&
                     0...1 ~= saturation &&
                     0...1 ~= lightness &&
                     0...1 ~= alpha, "input range is out of range 0...1")
        
        //From HSL TO HSB ---------
        var newSaturation: CGFloat = 0.0
        
        let brightness = lightness + saturation * min(lightness, 1-lightness)
        
        if brightness == 0 { newSaturation = 0.0 }
        else {
            newSaturation = 2 * (1 - lightness / brightness)
        }
        //---------
        
        self.init(hue: hue, saturation: newSaturation, brightness: brightness, alpha: alpha)
    }
}
Run Code Online (Sandbox Code Playgroud)

Color

import SwiftUI

extension Color {
    init(hue: Double, saturation: Double, lightness: Double, opacity: Double) {
        precondition(0...1 ~= hue &&
                     0...1 ~= saturation &&
                     0...1 ~= lightness &&
                     0...1 ~= opacity, "input range is out of range 0...1")
        
        //From HSL TO HSB ---------
        var newSaturation: Double = 0.0
        
        let brightness = lightness + saturation * min(lightness, 1-lightness)
        
        if brightness == 0 { newSaturation = 0.0 }
        else {
            newSaturation = 2 * (1 - lightness / brightness)
        }
        //---------
        
        self.init(hue: hue, saturation: newSaturation, brightness: brightness, opacity: opacity)
    }
}
Run Code Online (Sandbox Code Playgroud)