Skip to content

Instantly share code, notes, and snippets.

@bargar
Created August 15, 2018 21:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bargar/163adf2ab64e6959fbd247dfb3b85aa2 to your computer and use it in GitHub Desktop.
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
// 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