Office Open XML satMod导致100%以上的饱和度

我正在尝试计算satMod(饱和度调制),如下所示:

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

EMCA-376规范的第20.1.2.3.27节说明了<satMod>元素:“该元素指定了饱和度由给定百分比调制的input颜色,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。 对于我来说还没有解决的问题。

那是我问那个原始的问题。 我已经知道了。 随着单一颜色转换( satModredModlumMod等),您必须将值限制在sRGB 0,0,0或255,255,255(或1.0,1.0,1.0)范围内。 这意味着如果您的satMod将您的颜色修改为300%,并且结果是255以上的颜色值,请将其设置为255(或1.0)。 用这种结果颜色,你可以应用其他颜色变换,如果它们在你的颜色srgbClr或其他颜色空间。

这就是我在像你这样的例子中所做的。

  1. 将颜色转换为HSL空间(这种types的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可能是不同的(这里有一个很长的线程处理图表,也可能有你的答案)。 请记住,修改饱和度也可以根据您的程序编码来修改亮度。 如果是这种情况,则在从HSL转换回RGB时,您将需要使用原始亮度。

如果这些都不适合你,你可以把一个XLSX例子放在一个DropBox指向什么地方,你在等什么?