Swift言語に限った内容ではありませんが、
補色 と 反対色
補色 と 反対色 は、異なる色です。
- 補色 :色相上 正反対に位置する色
- 反対色:色相だけでなく 明度や彩度も 反対に位置する色
コード
UIColor
/NSColor
から 補色 と 反対色 を求める Swift のコードです。
Swift
#if os(macOS)
typealias UIColor = NSColor
#endif
extension UIColor {
//補色を求める
var complementaryColor: UIColor {
guard let (r, g, b, a) = self.getRGBA() else { return self }
let mix = [r, g, b].min()! + [r, g, b].max()!
return UIColor(red: mix - r, green: mix - g, blue: mix - b, alpha: a)
}
//反対色を求める
var oppositeColor: UIColor {
guard let (r, g, b, a) = self.getRGBA() else { return self }
return UIColor(red: 1 - r, green: 1 - g, blue: 1 - b, alpha: a)
}
//RGBAを求める
func getRGBA() -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat)? {
var r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat
(r, g, b, a) = (0, 0, 0, 0)
#if os(macOS)
self.getRed(&r, green: &g, blue: &b, alpha: &a)
#else
guard self.getRed(&r, green: &g, blue: &b, alpha: &a) else { return nil }
#endif
return (r, g, b, a)
}
//おまけ
//RGB を 0-255 で指定するイニシャライザ
convenience init(_ r: Int, _ g: Int, _ b: Int) {
self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: 1)
}
}
今さらの内容ですが、補色の求め方を間違って理解していたので、ここに残しておきます。
以上