Created
August 15, 2018 21:30
-
-
Save bargar/163adf2ab64e6959fbd247dfb3b85aa2 to your computer and use it in GitHub Desktop.
determine if light or dark foreground is better for a given background color
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// inspiration: https://stackoverflow.com/a/3943023/558780 | |
// wc3 approach | |
public static func favorsDarkForeground(_ bgColor: UIColor) -> Bool { | |
if let rgb = bgColor.rgb() { | |
var uicolors: Array<Float> = [Float(rgb.red) / 255, Float(rgb.green) / 255, Float(rgb.blue) / 255]; | |
var c = uicolors.map({ (uicolor) -> Float in | |
if (uicolor <= 0.03928) { | |
return uicolor / 12.92 | |
} | |
return pow(((uicolor + 0.055) / 1.055), 2.4) | |
}) | |
var L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]) | |
return L > 0.179 | |
} else { | |
print("could not get rgb values") | |
return false | |
} | |
} | |
// simpler (in some cases better results) | |
public static func favorsDarkForeground2(_ bgColor: UIColor) -> Bool { | |
if let rgb = bgColor.rgb() { | |
return (((Float(rgb.red) * 0.299) + (Float(rgb.green) * 0.587) + (Float(rgb.blue) * 0.114)) > 186) | |
} else { | |
return false | |
} | |
} | |
extension UIColor { | |
func rgb() -> (red:Int, green:Int, blue:Int, alpha:Int)? { | |
var fRed : CGFloat = 0 | |
var fGreen : CGFloat = 0 | |
var fBlue : CGFloat = 0 | |
var fAlpha: CGFloat = 0 | |
if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) { | |
let iRed = Int(fRed * 255.0) | |
let iGreen = Int(fGreen * 255.0) | |
let iBlue = Int(fBlue * 255.0) | |
let iAlpha = Int(fAlpha * 255.0) | |
return (red:iRed, green:iGreen, blue:iBlue, alpha:iAlpha) | |
} else { | |
// Could not extract RGBA components: | |
return nil | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment