Это я задал этот оригинальный вопрос. С тех пор я понял это. При любых единичных цветовых преобразованиях (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
Обратите внимание, что нет необходимости использовать Linear RGB в случае, когда вы только изменяете насыщенность. Я поддерживаю пространства RBG и HSL в полях уровня класса (RGB в 0-1), поэтому в конце этой процедуры вы видите sRGB_To_HSL(Red, Green, Blue)
.
Теперь это для DrawingML, как он появляется в PowerPoint. Excel может отличаться (есть длинная ветка здесь , которая имеет дело с диаграммами, которые также могут иметь ваш ответ). Имейте в виду, что изменение насыщенности также может изменять яркость в зависимости от того, как вы закодировали свою программу. В таком случае вы захотите использовать исходную яркость при преобразовании обратно из HSL в RGB.
Если ничего из этого не работает для вас, вы можете поместить пример XLSX на
DropBox укажите куда-нибудь, что происходит, что вы ожидаете и т. Д .?