繁体   English   中英

将互操作颜色转换为System.Drawing.Color

[英]Convert Interop Color to System.Drawing.Color

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

我在这里这里的论坛中发现了相反的情况,但是我没有找到如何从Interop Color转换为System.Drawing.Color。

我了解Interop颜色以RGB表示,考虑到:

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

但是从RGB值中查找Red Green Blue的值并不容易(例如,如果值为5652,我不知道如何找到Red为20,Green为22)。

您是否知道将Microsoft.Office.Interop.Word / Excel / PowerPoint.Color转换为System.Drawing.Color(或转换为OLE,然后知道如何转换)的功能?

如果您以十六进制格式查看数据,那么这一切将更加简单。 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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM