我已经能够在使用自定义颜色选择颜色的 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 vals?
最佳答案
我无法快速在谷歌上搜索引用,但如果我没记错的话,Word 将返回三种可能的数据格式。
RGB 格式
如果高字节为 &H00
那么剩下的三个字节代表红、绿、蓝。这是您熟悉并已经处理的格式。
自动颜色
如果值为 &HFF000000
也称为 -16777216
然后颜色设置为自动,通常是黑色。否则,它采用文档的默认颜色。
神秘的第三负格式
如果高字节的高半字节为 &HD
,也就是说如果数字的十六进制表示的第一个数字是D,那么它使用Word配色方案格式。
例如,您可能会收到 &D500FFFF
第二个半字节,&H5
在我们的示例中,最多匹配枚举 WdThemeColorIndex 中的一个值。如果您创建一个从该枚举转换为 MsoThemeColorSchemeIndex 枚举的转换表,则您可以在文档的 ActiveDocument.DocumentTheme.ThemeColorScheme
中查找基本颜色。收藏。为什么你问的同一件事有两个具有不同索引号的枚举?好问题!继续...
然而这并不是故事的结局!还有最后三个剩余字节需要担心!下一个,高字的低字节,我觉得很简单。我相信它总是&H00
.如果您遇到该字节的不同值...好吧,祝您好运。
最后两个字节表示使值变暗或变亮(分别)的百分比。哪里&FF
或 255 表示没有变化和 &h00
表示 100%。与在颜色选择器中看到的内容相同,例如“Accent 2, Lighter 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。但我现在不想弄清楚。
关于VBA 返回文本的 RGB 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18614933/