8

私は一日中これと戦ってきました。私の styles.xml ファイル内には、次のような色情報があります。

<fgColor theme="0" tint="-0.249977111117893" />

ECMA 376 では、テーマのカラー リファレンスを次のように定義しています。

<clrScheme> コレクションにインデックスを付け、テーマ パーツで表現された特定の <sysClr> または <srgbClr> 値を参照します。

わかりました、それは簡単ですね。以下は、私の clrScheme xml からの抜粋です。

<a:clrScheme name="Office">
<a:dk1>
<a:sysClr val="windowText" lastClr="000000" />
</a:dk1>
<a:lt1>
<a:sysClr val="window " lastClr="FFFFFF" />
</a:lt1>

インデックス ゼロは黒く、暗くしたいのですか? 色合いが適用された後、色は #F2F2F2 になるはずです。

私の混乱は、theme="0" の本当の意味は何ですか? #000000 を暗くすることはできません。MSDN をチェックすると、さらに混乱するだけです。http://msdn.microsoft.com/en-us/library/dd560821.aspxから

テーマ色の整数は、パレットの左から右にゼロから数え始めることに注意してください。テーマの色 3 は、暗い 2 のテキスト/背景色です。

実際、ゼロからカウントを開始すると、3 番目のエントリはライト 2 です。ダーク 2 は 2 番目のエントリです。ここで誰かが私のためにこの主題に光を当てることができますか? theme="0" とはどういう意味ですか?

これは、色合いを適用するために使用しているVB6コードです。これを VBA エディターに貼り付けて、test サブを実行できます。

Public Type tRGB
    R As Byte
    G As Byte
    B As Byte
End Type

Public Type tHSL
    H As Double
    S As Double
    L As Double
End Type

Sub TestRgbTint()
    Dim c As tRGB
    RGB_Hex2Type "ffffff", c
    RGB_ApplyTint c, -0.249977111117893
    Debug.Print Hex(c.R) & Hex(c.G) & Hex(c.B)
End Sub

Public Sub RGB_Hex2Type(ByVal HexString As String, RGB As tRGB)
    'Remove the alpha channel if it exists
    If Len(HexString) = 8 Then
        HexString = mID(HexString, 3)
    End If

    RGB.R = CByte("&H" & Left(HexString, 2))
    RGB.G = CByte("&H" & mID(HexString, 3, 2))
    RGB.B = CByte("&H" & Right(HexString, 2))
End Sub

Public Sub RGB_ApplyTint(RGB As tRGB, tint As Double)
    Const HLSMAX = 1#
    Dim HSL As tHSL

    If tint = 0 Then Exit Sub

    RGB2HSL RGB, HSL

    If tint < 0 Then
        HSL.L = HSL.L * (1# + tint)
    Else
        HSL.L = HSL.L * (1# - tint) + (HLSMAX - HLSMAX * (1# - tint))
    End If

    HSL2RGB HSL, RGB
End Sub

Public Sub HSL2RGB(HSL As tHSL, RGB As tRGB)
    HSL2RGB_ByVal HSL.H, HSL.S, HSL.L, RGB
End Sub

Private Sub HSL2RGB_ByVal(ByVal H As Double, ByVal S As Double, ByVal L As Double, RGB As tRGB)
    Dim v As Double
    Dim R As Double, G As Double, B As Double

    'Default color to gray
    R = L
    G = L
    B = L
    If L < 0.5 Then
        v = L * (1# + S)
    Else
        v = L + S - L * S
    End If
    If v > 0 Then
        Dim m As Double, sv As Double
        Dim sextant As Integer
        Dim fract As Double, vsf As Double, mid1 As Double, mid2 As Double
        m = L + L - v
        sv = (v - m) / v
        H = H * 6#
        sextant = Int(H)
        fract = H - sextant
        vsf = v * sv * fract
        mid1 = m + vsf
        mid2 = v - vsf
        Select Case sextant
            Case 0
                R = v
                G = mid1
                B = m
            Case 1
                R = mid2
                G = v
                B = m
            Case 2
                R = m
                G = v
                B = mid1
            Case 3
                R = m
                G = mid2
                B = v
            Case 4
                R = mid1
                G = m
                B = v
            Case 5
                R = v
                G = m
                B = mid2
        End Select
    End If

    RGB.R = R * 255#
    RGB.G = G * 255#
    RGB.B = B * 255#
End Sub

Public Sub RGB2HSL(RGB As tRGB, HSL As tHSL)
    Dim R As Double, G As Double, B As Double
    Dim v As Double, m As Double, vm As Double
    Dim r2 As Double, g2 As Double, b2 As Double

    R = RGB.R / 255#
    G = RGB.G / 255#
    B = RGB.B / 255#

    'Default to black
    HSL.H = 0
    HSL.S = 0
    HSL.L = 0
    v = IIf(R > G, R, G)
    v = IIf(v > B, v, B)
    m = IIf(R < G, R, G)
    m = IIf(m < B, m, B)
    HSL.L = (m + v) / 2#
    If HSL.L < 0 Then
        Exit Sub
    End If
    vm = v - m
    HSL.S = vm
    If HSL.S > 0 Then
        If HSL.L <= 0.5 Then
            HSL.S = HSL.S / (v + m)
        Else
            HSL.S = HSL.S / (2# - v - m)
        End If
    Else
        Exit Sub
    End If
    r2 = (v - R) / vm
    g2 = (v - G) / vm
    b2 = (v - B) / vm
    If R = v Then
        If G = m Then
            HSL.H = 5# + b2
        Else
            HSL.H = 1# - g2
        End If
    ElseIf G = v Then
        If B = m Then
            HSL.H = 1# + r2
        Else
            HSL.H = 3# - b2
        End If
    Else
        If R = m Then
            HSL.H = 3# + g2
        Else
            HSL.H = 5# - r2
        End If
    End If
    HSL.H = HSL.H / 6#
End Sub
4

2 に答える 2

8

odf-converter.sourceforge.net から xsl を確認したところ、0 と 1 が入れ替わり、2 と 3 が入れ替わっているように見えます。xsl 部分は次のとおりです。

    <xsl:variable name="theme">
      <xsl:choose>
        <xsl:when test="@theme = 0">
          <xsl:text>1</xsl:text>
        </xsl:when>
        <xsl:when test="@theme = 1">
          <xsl:text>0</xsl:text>
        </xsl:when>
        <xsl:when test="@theme = 2">
          <xsl:text>3</xsl:text>
        </xsl:when>
        <xsl:when test="@theme = 3">
          <xsl:text>2</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="@theme"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

すべてが一致するようになりました。0=1、1=0、2=3、3=2 スイッチに注意してください。

于 2010-05-03T21:32:35.973 に答える
3

そう、テーマカラーのインデックスです。0 は「最初のもの」、つまり 1 です。Excel を使用しているようです。PowerPoint の場合、色合い/色合いのアルゴリズムが異なることに注意してください。これは、HSL に基づいているのではなく、リニア RGB に基づいています。

于 2010-05-04T16:39:54.487 に答える