结论在最后~
为了提高产品视觉体验,今天做了一个需求,要根据颜色的深浅来自动变换文字的颜色
刚开始的时候我想拿 rbg 三个值的和来判断,🤔我认为!因为白色黑色是两个极端,所以相加刚好能跟亮度关联起来的!
var vRed: CGFloat = 0
var vGreen: CGFloat = 0
var vBlue: CGFloat = 0
var vAlpha: CGFloat = 0
tintColor.getRed(&vRed, green: &vGreen, blue: &vBlue, alpha: &vAlpha)
if fontColor = (vRed+vGreen+vBlue) < 2 {
//浅色
} else {
//深色
}
我的两个颜色,50, 193, 255 跟 70, 190, 250,肉眼识别差不多的两个蓝色,一个是判断出来是深色,一个是浅色
以及我发现黄色 #FFFF00,通过这个判断也是深色!
但是黄色怎么看都不符合深色的规则
后来发现 RGB 其实是不适合处理这种情况的,后来查资料找到了 YUV 模式,所以将 RGB 转为 YUV 编码
其中「Y」刚好表示 明亮度!
所以判断深浅只需要获得这个 Y 就可以了,找到的转换公式
Y = 0.299R + 0.587G + 0.114B
Swift 上做值的处理,因为我 rgb 三个值的范围是 0 ~ 1,所以我的判断条件是:
let yValue = 0.299 * vRed + 0.587 & vGreen + 0.114 * vBlue
if yValue > 0.75 {
//浅色
} else {
//深色
}
Done.