代码之家  ›  专栏  ›  技术社区  ›  dmaruca

电子表格中的主题混淆

  •  7
  • dmaruca  · 技术社区  · 16 年前

    我一整天都在和这个战斗。在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”lastcrl=“000000”/>
    </A:dk1>
    <a:lt1>
    <a:sysclr val=“window”lastcrl=“ffffff”/>
    </A:lt1>

    索引0是黑色的,他们想把它变暗吗?我可以告诉你,色调应用后,颜色应该是f2f2f2。

    我的困惑是,theme=“0”到底是什么意思?它不可能意味着变暗000000。查看msdn只会让我更加困惑。从 http://msdn.microsoft.com/en-us/library/dd560821.aspx

    注意主题颜色整数 开始从左到右计数 调色板从零开始。主题 颜色3是深色2文本/背景 颜色。

    实际上,如果你从零开始计数,第三个条目是light 2。黑暗2是第二个。这里有人能为我解释一下这个问题吗?theme=“0”到底是什么意思?

    这是我一直在使用的VB6代码来应用色调。您可以将其粘贴到VBA编辑器中并运行测试子组件。

    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
    
    2 回复  |  直到 13 年前
        1
  •  7
  •   dmaruca    13 年前

    我从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开关。

        2
  •  2
  •   Todd Main    16 年前

    是的,这是主题颜色的索引。0是“第一个”,即1。看起来你在做excel。对于powerpoint,请注意色调/阴影算法是不同的-它不是基于hsl而是基于线性rgb。