那是我问了那个原始问题。从那以后我就明白了。对于单一颜色转换(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。我在类级别字段中同时维护 RBG 和 HSL 空间(RGB 在 0-1 空间中),这就是您 sRGB_To_HSL(Red, Green, Blue)
在该例程末尾看到的原因。
现在这是用于在 PowerPoint 中显示的 DrawingML。Excel 可能会有所不同(这里有一个冗长的线程来处理可能也有你答案的图表)。请记住,根据您编写程序的方式,修改饱和度也可以修改亮度。如果是这种情况,您需要在从 HSL 转换回 RGB 时使用原始亮度。
如果这些都不适合您,您能否将示例 XLSX 放在某个
DropBox点上,说明正在发生的事情、您的期望等?