给定一种颜色的十六进制,我怎样才能使颜色变得更轻更黑? [英] Given a hex for a color, how can I make that color lighter and darker?

查看:122
本文介绍了给定一种颜色的十六进制,我怎样才能使颜色变得更轻更黑?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个十六进制,如:5fc9f8



是否有一个函数接受黑暗程度(-10到10)并返回一个十六进制反映了这一点?



通过黑暗我的意思是添加黑色/从颜色中移除黑色。 / div>

  import UIKit 

扩展字符串{
下标(范围:范围< Int>) - >字符串{
return range.startIndex< 0 || range.endIndex>伯爵(自我)? 超出范围:substringWithRange(范围(start:advance(startIndex,range.startIndex),end:advance(startIndex,range.endIndex)))
}
var hexaCGFloat:CGFloat {
返回CGFloat(strtoul(self,nil,16))
}
}
扩展UIColor {
var rgbComponents :(红色:CGFloat,绿色:CGFloat,蓝色:CGFloat, alpha:CGFloat){
var r:CGFloat = 0,g:CGFloat = 0,b:CGFloat = 0,a:CGFloat = 0
如果为getRed(& r,green:& g, blue:& b,alpha:& a){
return(r,g,b,a)
}
return(0,0,0,0)
}
var hsbComponents :(色调:CGFloat,饱和度:CGFloat,亮度:CGFloat,alpha:CGFloat){
var h:CGFloat = 0,s:CGFloat = 0,b:CGFloat = 0,a :CGFloat = 0
如果getHue(& h,饱和度:& s,亮度:& b,alpha:& a){
return(h,s,b,a)

return(0,0,0,0)
}
var hslComponents :(色相:CGFloat,s aturation:CGFloat,lightness:CGFloat,alpha:CGFloat){
let rgb = rgbComponents,hsb = hsbComponents
let maximum = max(rgb.red,rgb.green,rgb.blue)
让minimum = min(rgb.red,rgb.green,rgb.blue)
let range = maximum - minimum
let lightness =(maximum + minimum)/ 2.0
let saturation = range = = 0? 0:范围/ {返回亮度< 0.5? lightness * 2:2 - (lightness * 2)}()
return(hsb.hue,saturation,lightness,hsb.alpha)
}
方便初始化(色调:CGFloat,var saturation :CGFloat,var lightness:CGFloat,alpha:CGFloat){
明度* = 2
饱和度* =亮度<= 1?亮度:2 - 亮度
self.init(色调:色调,饱和度:亮度== 0?0:(2 *饱和度)/(亮度+饱和度),亮度:(亮度+饱和度)/ 2,alpha: 1)
}

便捷初始化(htmlColor:String,alpha:Double){
self.init(red:htmlColor [0 ... 1] .hexaCGFloat / 255.0, green:htmlColor [2 ... 3] .hexaCGFloat / 255.0,blue:htmlColor [4 ... 5] .hexaCGFloat / 255.0,alpha:CGFloat(alpha))
}
}

测试

<$ p $ (colorColor = UIColor(htmlColor:5fc9f8,alpha:1)

let colorHSL = color.hslComponents

let lighterColor = UIColor( hue:colorHSL.hue,saturation:colorHSL.saturation,lightness:min(colorHSL.lightness * 1.3,1.0),alpha:1)
let darkerColor = UIColor(hue:colorHSL.hue,saturation:colorHSL.saturation, lightness:max(colorHSL.lightness * 0.5,0.0),alpha:1)


Let's say I have a hex such as: 5fc9f8

Is there a function that accepts "levels of darkness" (-10 to 10) and returns a hex that reflects that?

By darkness I mean add black/remove black from the color.

解决方案

import UIKit

extension String {
    subscript (range: Range<Int>) -> String {
        return range.startIndex < 0 || range.endIndex > count(self) ? "Out of Range" : substringWithRange(Range(start:advance(startIndex,range.startIndex),end:advance(startIndex,range.endIndex)))
    }
    var hexaCGFloat: CGFloat {
        return CGFloat(strtoul(self, nil, 16))
    }
}
extension UIColor {
    var rgbComponents:(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
        if getRed(&r, green: &g, blue: &b, alpha: &a) {
            return (r,g,b,a)
        }
        return (0,0,0,0)
    }
    var hsbComponents:(hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat) {
        var h:CGFloat = 0, s:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
        if getHue(&h, saturation: &s, brightness: &b, alpha: &a){
            return (h,s,b,a)
        }
        return (0,0,0,0)
    }
    var hslComponents:(hue: CGFloat, saturation: CGFloat, lightness: CGFloat, alpha: CGFloat) {
        let rgb = rgbComponents, hsb = hsbComponents
        let maximum = max(rgb.red, rgb.green, rgb.blue)
        let minimum = min(rgb.red, rgb.green, rgb.blue)
        let range = maximum - minimum
        let lightness = (maximum + minimum) / 2.0
        let saturation = range == 0 ? 0 : range / { return lightness < 0.5 ? lightness * 2 : 2 - (lightness * 2) }()
        return (hsb.hue, saturation, lightness, hsb.alpha)
    }
    convenience init(hue: CGFloat, var saturation:CGFloat , var lightness:CGFloat , alpha: CGFloat) {
        lightness *= 2
        saturation *= lightness <= 1 ? lightness : 2 - lightness
        self.init(hue: hue, saturation: lightness == 0 ? 0 : (2*saturation)/(lightness+saturation), brightness: (lightness+saturation)/2, alpha: 1)
    }

    convenience init(htmlColor:String, alpha: Double) {
        self.init(red: htmlColor[0...1].hexaCGFloat / 255.0, green: htmlColor[2...3].hexaCGFloat / 255.0, blue: htmlColor[4...5].hexaCGFloat / 255.0, alpha: CGFloat(alpha)  )
    }
}

Testing

let color = UIColor(htmlColor: "5fc9f8", alpha: 1)

let colorHSL = color.hslComponents

let lighterColor = UIColor(hue:colorHSL.hue, saturation: colorHSL.saturation, lightness: min(colorHSL.lightness * 1.3,1.0), alpha: 1)
let darkerColor = UIColor(hue:colorHSL.hue, saturation: colorHSL.saturation, lightness: max(colorHSL.lightness * 0.5,0.0), alpha: 1)

这篇关于给定一种颜色的十六进制,我怎样才能使颜色变得更轻更黑?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆