将Interop Color转换为System.Drawing.Color

时间:2018-04-01 15:31:47

标签: c# office-interop

我正在寻找如何在C#中将Microsoft.Office.Interop.Word / Excel / PowerPoint.Color转换为System.Drawing.Color。

我在此论坛herehere中发现了相反的情况,但我找不到如何从Interop Color转换为System.Drawing.Color。

据我所知,Interop颜色用RGB表示:

  

RGBvalue =红色+ 256 *绿色+ 256 * 256 *蓝色

但是从RGBvalue中找到红绿蓝的值并不是很容易(例如,如果值为5652,我不知道如何找到Red是20而Green是22)。

你知道一个函数将Microsoft.Office.Interop.Word / Excel / PowerPoint.Color转换为System.Drawing.Color(或者转换为OLE然后,我知道如何转换)?

1 个答案:

答案 0 :(得分:3)

如果以十六进制格式查看数据,这一切都会简单得多。 5652变为0x1614,显然是字节0x16和0x14。或者,0x16 * 0x100 + 0x14

与0x100相乘的反面应该只是将其除以0x100,但为了实际切断多余的,我建议使用AND位操作。

AND将仅保留两个值中共有的位,因此,在二进制表示中,为了仅保留最低的8位,您需要将其与启用了所有8位的值进行AND运算,这将是0xFF。以二进制格式查看的0x1614(您的“5652”示例)和0xFF之间的AND将如下所示:

00010110 00010100
00000000 11111111
v------AND------v
00000000 00010100

如您所见,它有效地切断了高于最低字节的所有内容,从而产生00010100b,或0x14,或20。

为了除以2的倍数,还有另一个非常方便且非常有效的位操作:位移位。 0x100实际上是'1',向上移动了8位。因此,为了获得原始值,只需将向下移位8位。

如果您的颜色为B * 0x10000 + G * 0x100 + R,则将其反转:

public static Color GetColorFromInterop(Int32 val)
{
    // Limit to a value containing only the bits in 0xFF
    Int32 r = val & 0xFF;
    // Shift down by 8 bits (meaning, divide by 0x100), then limit to 0xFF
    Int32 g = (val >> 8) & 0xFF;
    // Shift down by 16 bits (meaning, divide by 0x10000), then limit to 0xFF
    Int32 b = (val >> 16) & 0xFF;
    return Color.FromArgb(r, g, b);
}