我已经能够返回word文档中文本的RGB颜色,其中颜色是使用自定义颜色选择的,但在使用标准颜色时则不能返回。我最初使用以下代码:
Function GetRGBTest(Colour As Long) As String
GetRGBTest = "rgb(" & (Colour Mod 256) & "," & ((Colour 256) Mod 256) & "," & ((Colour 256 256) Mod 256) & ")"
End Function
Sub TestColour()
MsgBox GetRGBTest(Selection.Font.Color)
End Sub
使用标准颜色时,selection.font.color返回负值,并且RGB值不正确。
我已经尝试编辑它,使其具有以下内容(其中Dict是colorindex和各自的rgb vals的列表):
Function GetRGBTest(Colour As Long, colInd As Integer) As String
If Colour > 0 Then
GetRGBTest = "rgb(" & (Colour Mod 256) & "," & ((Colour 256) Mod 256) & "," & ((Colour 256 256) Mod 256) & ")"
Else
colInd = LTrim(Str(colInd))
GetRGBTest = Dict.Item(colInd)
End If
End Function
Sub TestColour()
MsgBox GetRGBTest(Selection.Font.Color, Selection.Font.ColorIndex)
End Sub
尽管我认为ColorIndex返回的值与标准颜色无关。
有人知道如何将这些值转换为RGB值吗?
我无法快速在谷歌上查找参考,但如果我记得正确的话,Word将返回三种可能的数据格式。
RGB格式
如果高字节是&H00
,那么剩余的三个字节表示红色、绿色和蓝色。这是您熟悉并且已经在处理的格式。
自动着色
如果值为&HFF000000
(也称为-16777216
),则颜色设置为自动,通常为黑色。否则,它将采用文档的默认颜色。
神秘的第三种底片格式
如果高字节的高半字节是&HD
,也就是说,如果数字的十六进制表示的第一位是D,则它使用Word配色方案格式。
例如,您可能会得到&D500FFFF
在我们的示例中,第二个半字节&H5
与枚举WdThemeColorIndex中的值匹配。如果创建一个转换表,将该枚举转换为MsoThemeColorSchemeIndex枚举,则可以在文档的ActiveDocument.DocumentTheme.ThemeColorScheme
集合中查找基本颜色。为什么你问的同一件事有两个不同索引号的枚举?好问题!继续…
然而,故事还没有结束!还有剩下的最后三个字节需要担心!下一个,高位字的低位字节,我觉得很容易。我相信它总是&H00
。如果遇到该字节的不同值。。。祝你好运。
最后两个字节表示使值变暗或变亮的百分比(分别)。其中&FF
或255表示无变化,&h00
表示100%。与在颜色选择器中一样,在那里你可以看到像";强调文字颜色2,浅色60%";。顺便说一下,&HD500FF66
,5是Accent 2的索引,&H66
是较轻字节中的60%。
因此,这里有一个函数,它不考虑较亮和较暗的值:
Public Function GetBasicRGB(color As Long) As String
Dim colorIndexLookup
Dim colorIndex As Integer
Dim finalColor As Long
colorIndexLookup = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 2, 1, 4, 3)
colorIndex = colorIndexLookup( _
((color And &HF000000) / &H1000000) _
+ LBound(colorIndexLookup))
finalColor = ActiveDocument.DocumentTheme.ThemeColorScheme(colorIndex)
GetBasicRGB = "rgb(" & (finalColor And &HFF) & "," & _
(finalColor / &H100 And &HFF) & "," & _
((finalColor And &HFF0000) / &H10000) & ")"
End Function
为了解释较亮和较暗的情况,我认为您必须将RGB值转换为HSL值,然后将L分量修改为较亮或较暗的%。最后转换回RGB。但我现在不想弄清楚。
感谢AndASM对这个特殊问题的精彩描述。我一直在编写一个Perl程序,该程序使用Win32::OLE
库读取单词文档。我的目标是以不同的格式输出文档,当我遇到这些索引值时,我发现自己深受困扰。在正确的指导下,我最终用Perl为这些索引构建了一个散列查找。我去掉了十六进制字符串中所有看起来无用的东西(比如&H00
字节),并构建了一个搜索字符串,当通过这个哈希图时返回RGB值:
my %indexedColors = (
"ff0000" => [0,0,0],
"dcffff" => [255,255,255],
"dcf2ff" => [242,242,242],
"dcd9ff" => [217,217,217],
"dcbfff" => [191,191,191],
"dca6ff" => [166,166,166],
"dc80ff" => [128,128,128],
"ddffff" => [0,0,0],
"ddff80" => [127,127,127],
"ddffa6" => [89,89,89],
"ddffbf" => [64,64,64],
"ddffd9" => [38,38,38],
"ddfff2" => [13,13,13],
"deffff" => [238,236,225],
"dee6ff" => [221,217,195],
"debfff" => [196,188,150],
"de80ff" => [148,138,84],
"de40ff" => [74,68,42],
"de1aff" => [29,27,17],
"dfffff" => [31,73,125],
"dfff33" => [198,217,241],
"dfff66" => [141,179,226],
"dfff99" => [84,141,212],
"dfbfff" => [23,54,93],
"df80ff" => [15,36,62],
"d4ffff" => [79,129,189],
"d4ff33" => [219,229,241],
"d4ff66" => [184,204,228],
"d4ff99" => [149,179,215],
"d4bfff" => [54,95,145],
"d480ff" => [36,64,97],
"d5ffff" => [192,80,77],
"d5ff33" => [242,219,219],
"d5ff66" => [229,184,183],
"d5ff99" => [217,149,148],
"d5bfff" => [148,54,52],
"d580ff" => [99,36,35],
"d6ffff" => [155,187,89],
"d6ff33" => [221,217,195],
"d6ff66" => [214,227,188],
"d6ff99" => [194,214,155],
"d6bfff" => [118,146,60],
"d680ff" => [79,98,40],
"d7ffff" => [128,100,162],
"d7ff33" => [229,223,236],
"d7ff66" => [204,192,217],
"d7ff99" => [178,161,199],
"d7bfff" => [95,73,122],
"d780ff" => [64,49,82],
"d8ffff" => [75,172,198],
"d8ff33" => [218,238,243],
"d8ff66" => [182,221,232],
"d8ff99" => [146,205,220],
"d8bfff" => [49,132,155],
"d880ff" => [33,88,104],
"d9ffff" => [247,150,70],
"d9ff33" => [253,233,217],
"d9ff66" => [251,212,180],
"d9ff99" => [250,191,143],
"d9bfff" => [227,108,10],
"d980ff" => [152,72,6],
);
希望没有一个可怜的人需要深入研究微软的向后兼容性,只是以防万一。