2

次のような satMod (飽和変調) を計算しようとしています。

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

EMCA-376 仕様のセクション 20.1.2.3.27 は <satMod> 要素について次のように述べています。サチュレーションモジュレートはサチュレーションを2倍にします。」

私が抱えている問題は、多くの色がすでに十分に飽和しているため、彩度を 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に変換する必要があることを示しました。私にとって、それは問題を解決していません。

4

1 に答える 1

2

その最初の質問をしたのは私でした。それ以来、私はそれを理解しました。単一の色変換 ( satModredModlumModなど) では、値を 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) の2 つの呼び出しがあることに気付くでしょうClamp_sARGB()。1 つ目は sRGB 空間に変換し、2 つ目は次のように 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ポイントのどこかに置くことができますか?

于 2011-07-26T07:19:18.350 に答える