Skip to content

Instantly share code, notes, and snippets.

@mflint
Created January 14, 2018 20:29
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 mflint/9b3060651232b1ee120c6d703a0a6457 to your computer and use it in GitHub Desktop.
Save mflint/9b3060651232b1ee120c6d703a0a6457 to your computer and use it in GitHub Desktop.
UIColor extension for getting approximate colors. I use this in unit tests sometimes.
//: Playground - noun: a place where people can play
import UIKit
import XCTest
extension UIColor {
private struct Best {
var color: (color: UIColor, name: String)
var distance: CGFloat
}
func nearest() -> (color: UIColor, name: String) {
let colors: [(color: UIColor, name: String)] = [
(.black, "black"),
(.blue, "blue"),
(.brown, "brown"),
(.cyan, "cyan"),
(.gray, "gray"),
(.green, "green"),
(.magenta, "magenta"),
(.orange, "orange"),
(.purple, "purple"),
(.red, "red"),
(.white, "white"),
(.yellow, "yellow")
]
var best = Best(color: colors.first!, distance: CGFloat.greatestFiniteMagnitude)
for color in colors {
let distance = self.distance(from: color.color)
if distance < best.distance {
best = Best(color: color, distance: distance)
}
}
return best.color
}
private func distance(from color: UIColor) -> CGFloat {
var r1: CGFloat = 0
var g1: CGFloat = 0
var b1: CGFloat = 0
var a1: CGFloat = 0
var r2: CGFloat = 0
var g2: CGFloat = 0
var b2: CGFloat = 0
var a2: CGFloat = 0
guard getRed(&r1, green: &g1, blue: &b1, alpha: &a1) && color.getRed(&r2, green: &g2, blue: &b2, alpha: &a2) else {
preconditionFailure("that didn't work")
}
let redDistance = (r1 - r2) * 0.299
let greenDistance = (g1 - g2) * 0.587
let blueDistance = (b1 - b2) * 0.114
return (redDistance * redDistance) + (greenDistance * greenDistance) + (blueDistance * blueDistance)
}
}
let color1 = UIColor(red: 1.0, green: 0.74, blue: 0, alpha: 1)
let nearest1 = color1.nearest()
nearest1.color
nearest1.name
let color2 = UIColor(red: 1.0, green: 0.76, blue: 0, alpha: 1)
let nearest2 = color2.nearest()
nearest2.color
nearest2.name
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment