Return lighter color from SKColor using HSL lightness factor

后端 未结 2 1078
轻奢々
轻奢々 2020-12-07 05:36

I have an iOS SKColor, that I want to convert to a lighter shade (that is opaque with no opacity/no transparency), therefore I would like to implement a function using the H

相关标签:
2条回答
  • 2020-12-07 06:10

    Xcode 8.2.1 • Swift 3.0.2

    extension UIColor {
        convenience init(hue: CGFloat, saturation: CGFloat, lightness: CGFloat, alpha: CGFloat = 1)  {
            let offset = saturation * (lightness < 0.5 ? lightness : 1 - lightness)
            let brightness = lightness + offset
            let saturation = lightness > 0 ? 2 * offset / brightness : 0
            self.init(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha)
        }
        var lighter: UIColor? {
            return applying(lightness: 1.25)
        }
        func applying(lightness value: CGFloat) -> UIColor? {
            guard let hsl = hsl else { return nil }
            return UIColor(hue: hsl.hue, saturation: hsl.saturation, lightness: hsl.lightness * value, alpha: hsl.alpha)
        }
        var hsl: (hue: CGFloat, saturation: CGFloat, lightness: CGFloat, alpha: CGFloat)? {
            var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0, hue: CGFloat = 0
            guard
                getRed(&red, green: &green, blue: &blue, alpha: &alpha),
                getHue(&hue, saturation: nil, brightness: nil, alpha: nil)
            else { return nil }
            let upper = max(red, green, blue)
            let lower = min(red, green, blue)
            let range = upper - lower
            let lightness = (upper + lower) / 2
            let saturation = range == 0 ? 0 : range / (lightness < 0.5 ? lightness * 2 : 2 - lightness * 2)
            return (hue, saturation, lightness, alpha)
        }
    }
    

    let purple = UIColor(red: 160/255, green: 118/255, blue: 200/255, alpha: 1)
    let lighter = purple.lighter
    
    0 讨论(0)
  • 2020-12-07 06:16

    As the official SKColor doc says, on iOS, a SKColor is just a UIColor. Hence:

    UIColor *uicolor = (UIColor *)skcolor;
    CGFloat h, s, b, a; // lightness is called 'brightness' 
    [uicolor getHue:&h saturation:&s brightness:&b alpha:&a];
    
    // (play with your brightness value here)
    
    SKColor *skcolor2 = (SKColor *)[UIColor colorWithHue:h saturation:s brightness:b alpha:a];
    
    0 讨论(0)
提交回复
热议问题