那是我問那個原始問題。我從那以後就知道了。通過單一顏色轉換(satMod
,redMod
,lumMod
等),您必須將值限制在sRGB 0,0,0或255,255,255(或1.0,1.0,1.0)範圍內。這意味着如果您的satMod
將您的顏色修改了300%,並且結果爲255以上的顏色值,請將其限制爲255(或1.0)。使用該顏色,您可以應用其他顏色變換(如果它們的顏色爲srgbClr
或其他顏色空間)。
這就是我在你的例子中所做的。
將顏色轉換爲HSL空間(這些類型的RGB-> HSL例程在Bing/Google中查找時很常見)。
發送在顏色和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
在這一程序結束時,你會發現兩個電話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放在某個地方,並指出正在發生的事情,您期待的內容等。
偉大的分析。除了規範之外,有時(儘管不是這種特殊情況下)有用的是Microsoft的實現者注意事項:http://msdn.microsoft.com/en-us/library/ee908652.aspx。 –
@ 0xA3:完全同意,這是一個很好的資源。 –