如何保证NSColor有足够的饱和度?

时间:2015-05-30 22:57:02

标签: swift cocoa nscolor

我需要保证颜色有足够的饱和度。

我将此扩展程序设为NSColor,但我的测试给出了奇怪的值:tempColor似乎总是有很多饱和度。

所以基本上我的函数总是返回自我?

我的错误在哪里?

我也尝试过没有转换为NSCalibratedRGBColorSpace,但这没有帮助,输入颜色无论如何都可以是不同的类型。

extension NSColor {
    func withMinimumSaturation(minimumSaturation: CGFloat) -> NSColor {
        // color could be hue/rgb/other so we convert to rgb
        if var tempColor = self.colorUsingColorSpaceName(NSCalibratedRGBColorSpace) {
            // prepare the values
            var hue: CGFloat = 0.0
            var saturation: CGFloat = 0.0
            var brightness: CGFloat = 0.0
            var alpha: CGFloat = 0.0
            // populate the values
            tempColor.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
            // if color is not enough saturated
            if saturation < minimumSaturation {
                // return same color with more saturation
                return NSColor(calibratedHue: hue, saturation: minimumSaturation, brightness: brightness, alpha: alpha)
            }
        }
        // if detection fails, return same color
        return self
    }
}

用法:

let source = myColorFromAListOfColors // NSColor
let guaranteed = source.withMinimumSaturation(0.15)

编辑:实际上它有效。我已经接受了Aaron的答案,因为它帮助我理解了这种情况(我将颜色与他们的redComponents进行比较,而且它们通常相似)。

1 个答案:

答案 0 :(得分:2)

你的方法似乎很好。

对于饱和度非常低的颜色,它会返回不同的颜色:

enter image description here

如果我将最小饱和度从0.15增加到更重要的值,例如0.45,则更改更为重要:

enter image description here

所以,这种方法可以正常运行。我猜你只需调整0.15输入即可得到你想要的结果。

它可以帮助您记录旧的和新的饱和度以进行调试:

if saturation < minimumSaturation {
    // return same color with more saturation
    println("New saturation: \(minimumSaturation)")

    return NSColor(calibratedHue: hue, saturation: minimumSaturation, brightness: brightness, alpha: alpha)
} else {
    println("Discarding saturation: \(saturation)")
}