2011-07-19 48 views
2

我試圖計算satMod(飽和度調製)爲類似以下內容:EMCA-376的的Office Open XML satMod導致超過100%的飽和度

<a:srgbClr val="58CAFF"> 
    <a:satMod="300000"/> 
</a:srgbClr> 

科20.1.2.3.27 spec說<satMod>元素:「該元素指定輸入顏色飽和度由給定百分比調製,50%飽和度調製將飽和度降低一半,200%飽和度調製將飽和度加倍。

我遇到的問題是,許多顏色已經飽和到足以使飽和度增加300%(300000中的300000對應於300%),使其不在0-100%的範圍內。我一直在100%上限飽和,但我的結果與Excel的結果大不相同。

在飽和度應該溢出的情況下,似乎有一些特殊的魔法發生在這裏。任何人都知道Office/Excel在這種情況下做什麼?

我發現基本上相同的問題在這裏:http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/thread/040e0a1f-dbfe-4ce5-826b-38b4b6f6d3f7

答案表明飽和被修改前的sRGB顏色應該首先被再轉換爲線性RGB到HSL。對我來說還沒有解決問題。

回答

2

那是我問那個原始問題。我從那以後就知道了。通過單一顏色轉換(satMod,redMod,lumMod等),您必須將值限制在sRGB 0,0,0或255,255,255(或1.0,1.0,1.0)範圍內。這意味着如果您的satMod將您的顏色修改了300%,並且結果爲255以上的顏色值,請將其限制爲255(或1.0)。使用該顏色,您可以應用其他顏色變換(如果它們的顏色爲srgbClr或其他顏色空間)。

這就是我在你的例子中所做的。

  1. 將顏色轉換爲HSL空間(這些類型的RGB-> HSL例程在Bing/Google中查找時很常見)。

  2. 發送在顏色和satMod,以這樣的例程:

    Public Sub modulateHSL(ByVal c As HSL, ByVal val As System.Double) 
        Select Case c 
         Case HSL.Hue 
          Hue = Hue * val 
          If Hue = 0.0 Then 
           If val >= 1.0 Then 
            Hue = val - Fix(val) 
           End If 
          Else 
           Hue = Hue - Fix(Hue) 
          End If 
         Case HSL.Saturation 
          Saturation = Saturation * val 
         Case HSL.Luminance 
          Luminance = Luminance * val 
        End Select 
        HSL_To_sRGB(Hue, Saturation, Luminance) 
        Clamp_sARGB() 
    End Sub 
    
  3. 在這一程序結束時,你會發現兩個電話1)HSL_To_sRGB(Hue, Saturation, Luminance)和2)Clamp_sARGB()。第一個轉換回sRGB空間,第二個夾子的RGB值,就像這樣:

    Public Sub Clamp_sARGB() 
        If Red <= 0.0 Then Red = 0.0 Else If Red >= 1.0 Then Red = 1.0 
        If Green <= 0.0 Then Green = 0.0 Else If Green >= 1.0 Then Green = 1.0 
        If Blue <= 0.0 Then Blue = 0.0 Else If Blue >= 1.0 Then Blue = 1.0 
        If Alpha <= 0.0 Then Alpha = 0.0 Else If Alpha >= 1.0 Then Alpha = 1.0 
        sRGB_To_HSL(Red, Green, Blue) 
    End Sub 
    

注意有沒有必要使用線性RGB的情況下你只修改飽和。我在類級字段(0-1空間中的RGB)中維護RBG和HSL空間,所以這就是爲什麼在該例程結束時看到sRGB_To_HSL(Red, Green, Blue)

現在這是DrawingML,因爲它出現在PowerPoint中。 Excel可能會有所不同(有很長的線程here處理圖表,可能也有你的答案)。請記住,修改飽和度還可以根據您對程序編碼的方式來修改亮度。如果是這種情況,那麼在從HSL轉換回RGB時需要使用原始亮度。

如果這一切都不適用於您,您可以將示例XLSX放在某個地方,並指出正在發生的事情,您期待的內容等。

+0

偉大的分析。除了規範之外,有時(儘管不是這種特殊情況下)有用的是Microsoft的實現者注意事項:http://msdn.microsoft.com/en-us/library/ee908652.aspx。 –

+0

@ 0xA3:完全同意,這是一個很好的資源。 –