Office Open XML satMod обеспечивает более чем 100% насыщение - PullRequest
2 голосов
/ 20 июля 2011

Я пытаюсь вычислить satMod (модуляция насыщения) для чего-то вроде следующего:

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

В разделе 20.1.2.3.27 спецификации EMCA-376 говорится об элементе : «Этот элемент задает входной цвет с его насыщенностью, модулированной заданным процентом. 50% -ный модуль насыщенности уменьшает насыщенность наполовину. 200% модуляция насыщенности удваивает насыщенность. "

Проблема, с которой я столкнулся, состоит в том, что многие цвета уже достаточно насыщены, поэтому увеличение насыщенности на 300% (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 до изменения насыщенности. Для меня это не решило проблему.

1 Ответ

2 голосов
/ 26 июля 2011

Это я задал этот оригинальный вопрос. С тех пор я понял это. При любых единичных цветовых преобразованиях (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
    

Обратите внимание, что нет необходимости использовать Linear RGB в случае, когда вы только изменяете насыщенность. Я поддерживаю пространства RBG и HSL в полях уровня класса (RGB в 0-1), поэтому в конце этой процедуры вы видите sRGB_To_HSL(Red, Green, Blue).

Теперь это для DrawingML, как он появляется в PowerPoint. Excel может отличаться (есть длинная ветка здесь , которая имеет дело с диаграммами, которые также могут иметь ваш ответ). Имейте в виду, что изменение насыщенности также может изменять яркость в зависимости от того, как вы закодировали свою программу. В таком случае вы захотите использовать исходную яркость при преобразовании обратно из HSL в RGB.

Если ничего из этого не работает для вас, вы можете поместить пример XLSX на DropBox укажите куда-нибудь, что происходит, что вы ожидаете и т. Д .?

...