2015-05-30 19 views
1

我需要保證顏色有足夠的飽和度。如何保證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進行比較,他們通常是相似的)。

+0

當我試着使用'讓源= NSColor.gridColor()'我得到不同的顏色。 –

回答

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)") 
} 
+0

對於我的測試,我用100個隨機顏色製作了一個循環,並在之前/之後比較了它們的redComponents。在測試過程中,我運氣不好......或者它可能是色彩空間問題?因爲有時輸入的顏色是基於白色的,或基於色調的,或rgb,或其他... – Moritz

+0

@EricD。我不確定顏色飽和度的統計分佈,但我可能會嘗試使用50,000個隨機顏色而不是100個測試。您可能也只是測試顏色是否相等,而不是僅查看'redComponents'。 –

+0

我懷疑色彩空間是如何進入它的。任何顏色都應該用HSB和不透明度值表示。 –