使用 HSL 亮度因子从 SKColor 返回较浅的颜色

use*_*955 2 uicolor ios sprite-kit swift

我有一个 iOS SKColor,我想将其转换为较浅的阴影(即不透明,没有不透明度/无透明度),因此我想使用 HSL 亮度实现一个函数,该函数返回 SKColor。IE。在函数内部,将原始 SKColor 转换为 HSL 等效值,然后对 HSL 亮度应用一个值以获得更浅的色调,然后将此 HSL 颜色转换回我可以使用的 SKColor。

Leo*_*bus 5

Xcode 14.3 \xe2\x80\xa2 斯威夫特 5.8

\n
extension UIColor {\n\n    convenience init(\n        hue: CGFloat,\n        saturation: CGFloat,\n        lightness: CGFloat,\n        alpha: CGFloat = 1\n    )  {\n        let offset = saturation * (lightness < 0.5 ? lightness : 1 - lightness)\n        let brightness = lightness + offset\n        let saturation = lightness > 0 ? 2 * offset / brightness : 0\n        self.init(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha)\n    }\n\n    var hsl: (\n        hue: CGFloat,\n        saturation: CGFloat,\n        lightness: CGFloat,\n        alpha: CGFloat\n    )? {\n        var (red, green, blue, alpha, hue): (CGFloat, CGFloat, CGFloat, CGFloat, CGFloat) = (0, 0, 0, 0, 0)\n        guard\n            getRed(&red, green: &green, blue: &blue, alpha: &alpha),\n            getHue(&hue, saturation: nil, brightness: nil, alpha: nil)\n        else {\n            return nil\n        }\n        let upper = max(red, green, blue)\n        let lower = min(red, green, blue)\n        let range = upper - lower\n        let lightness = (upper + lower) / 2\n        let saturation = range == 0 ? 0 : range / (lightness < 0.5 ? lightness * 2 : 2 - lightness * 2)\n        return (hue, saturation, lightness, alpha)\n    }\n\n    func getHSL(_ hue: UnsafeMutablePointer<CGFloat>?, saturation: UnsafeMutablePointer<CGFloat>?, lightness: UnsafeMutablePointer<CGFloat>?, alpha: UnsafeMutablePointer<CGFloat>?) -> Bool {\n        guard let hsl else { return false }\n        hue?.pointee = hsl.hue\n        saturation?.pointee = hsl.saturation\n        lightness?.pointee = hsl.lightness\n        alpha?.pointee = hsl.alpha\n        return true\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n
extension UIColor {\n\n    var lighter: UIColor? { adding(lightness: 0.1) }\n    var darker: UIColor? { adding(lightness: -0.1) }\n\n    func adding(lightness value: CGFloat) -> UIColor? {\n        guard let hsl else { return nil }\n        return UIColor(\n            hue: hsl.hue,\n            saturation: hsl.saturation,\n            lightness: min(max(hsl.lightness + value, 0),1),\n            alpha: hsl.alpha\n        )\n    }\n\n    func applying(lightness value: CGFloat) -> UIColor? {\n        guard let hsl else { return nil }\n        return UIColor(\n            hue: hsl.hue,\n            saturation: hsl.saturation,\n            lightness: value,\n            alpha: hsl.alpha\n        )\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n
let purple = UIColor(red: 160/255, green: 118/255, blue: 200/255, alpha: 1)\nlet lighter = purple.lighter\n
Run Code Online (Sandbox Code Playgroud)\n