Vb6 电子表格中的主题混淆
我已经为此奋斗了一整天。在my styles.xml文件中,我提供了如下颜色信息: ECMA 376将主题颜色参考定义为: 索引到集合中, 引用特定的或特定的 主题所表达的价值 部分 好的,听起来很简单。以下是我的clrScheme xml的摘录: 请注意,主题颜色为整数 开始按从左到右的顺序计数 调色板以零开始。主题 颜色3为深色2文本/背景 颜色 实际上,如果你从零开始计数,第三个条目是Light 2。黑暗2是第二个。这里有人能为我解释一下这个问题吗?theme=“0”的真正含义是什么 下面是我一直在使用的VB6代码来应用色调。您可以将其粘贴到vba编辑器中,然后运行test subVb6 电子表格中的主题混淆,vb6,themes,openxml,spreadsheetml,Vb6,Themes,Openxml,Spreadsheetml,我已经为此奋斗了一整天。在my styles.xml文件中,我提供了如下颜色信息: ECMA 376将主题颜色参考定义为: 索引到集合中, 引用特定的或特定的 主题所表达的价值 部分 好的,听起来很简单。以下是我的clrScheme xml的摘录: 请注意,主题颜色为整数 开始按从左到右的顺序计数 调色板以零开始。主题 颜色3为深色2文本/背景 颜色 实际上,如果你从零开始计数,第三个条目是Light 2。黑暗2是第二个。这里有人能为我解释一下这个问题吗?theme=“0”的真正含义是什么
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
公共类型tRGB
R作为字节
G作为字节
B作为字节
端型
公共类型tHSL
H是双倍的
这是双倍的
我是替身
端型
子测试rgbtint()
作为tRGB的dimc
RGB_Hex2Type“ffffff”,c
RGB_应用程序c,-0.249977111117893
调试。打印十六进制(c.R)&十六进制(c.G)&十六进制(c.B)
端接头
公共子RGB_Hex2Type(ByVal HexString作为字符串,RGB作为tRGB)
'删除alpha通道(如果存在)
如果Len(hextstring)=8,则
hextstring=mID(hextstring,3)
如果结束
RGB.R=CByte(“&H”&左(十六进制字符串,2))
RGB.G=CByte(“&H”和mID(十六进制字符串,3,2))
RGB.B=CByte(“&H”和右(十六进制字符串,2))
端接头
公共子RGB_应用程序(RGB为tRGB,色调为双色)
常数HLSMAX=1#
将HSL变暗为tHSL
如果色调=0,则退出Sub
RGB2HSL RGB,HSL
如果色调<0,则
HSL.L=HSL.L*(1#+色调)
其他的
HSL.L=HSL.L*(1#-tint)+(HLSMAX-HLSMAX*(1#-tint))
如果结束
HSL2RGB HSL,RGB
端接头
公共子HSL2RGB(HSL作为tHSL,RGB作为tRGB)
HSL2RGB_ByVal HSL.H、HSL.S、HSL.L、RGB
端接头
专用子HSL2RGB_ByVal(ByVal H为双精度,ByVal S为双精度,ByVal L为双精度,RGB为tRGB)
双倍调暗v
调暗R为双精度,G为双精度,B为双精度
'默认颜色为灰色
R=L
G=L
B=L
如果L<0.5,则
v=L*(1#+S)
其他的
v=L+S-L*S
如果结束
如果v>0,则
尺寸m为双精度,sv为双精度
作为整数的暗淡六分仪
Dim FRCT为双精度,vsf为双精度,mid1为双精度,mid2为双精度
m=L+L-v
sv=(v-m)/v
H=H*6#
六分仪=Int(H)
分形=H-六分仪
vsf=v*sv*fract
mid1=m+vsf
mid2=v-vsf
选格六分仪
案例0
R=v
G=mid1
B=m
案例1
R=mid2
G=v
B=m
案例2
R=m
G=v
B=mid1
案例3
R=m
G=mid2
B=v
案例4
R=mid1
G=m
B=v
案例5
R=v
G=m
B=mid2
结束选择
如果结束
RGB.R=R*255#
RGB.G=G*255#
RGB.B=B*255#
端接头
公共子RGB2HSL(RGB作为tRGB,HSL作为tHSL)
调暗R为双精度,G为双精度,B为双精度
尺寸v为双精度,m为双精度,vm为双精度
尺寸r2为双精度,g2为双精度,b2为双精度
R=RGB.R/255#
G=RGB.G/255#
B=RGB.B/255#
'默认为黑色
HSL.H=0
HSL.S=0
HSL.L=0
v=IIf(R>G,R,G)
v=IIf(v>B,v,B)
m=IIf(R0,则
如果HSL.L我从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>
1.
0
3.
2.
现在一切都匹配了。注意0=1,1=0,2=3,3=2开关。是的,它是主题颜色的索引。0为“第一个”,表示1。看起来你做得很出色。对于PowerPoint,请注意色调/阴影算法是不同的-它不是基于HSL,而是基于线性RGB。这太疯狂了。OOXML规范对排序非常明确,但Excel完全忽略了它。