将互操作颜色转换为 System.Drawing.Color
Convert Interop Color to System.Drawing.Color
我正在寻找如何在 C# 中将 Microsoft.Office.Interop.Word/Excel/PowerPoint.Color 转换为 System.Drawing.Color。
我在这个论坛上发现了相反的情况 here or here 但我没有找到如何从 Interop Color 转换为 System.Drawing.Color。
考虑到以下因素,我了解到 Interop 颜色以 RGB 表示:
RGBvalue = Red + 256*Green + 256*256*Blue
但是从 RGB 值中找到红绿蓝的值并不是很容易(例如如果值为 5652 我不知道如何找到红色是 20 和绿色是 22)。
您知道将 Microsoft.Office.Interop.Word/Excel/PowerPoint.颜色转换为 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);
}
我正在寻找如何在 C# 中将 Microsoft.Office.Interop.Word/Excel/PowerPoint.Color 转换为 System.Drawing.Color。
我在这个论坛上发现了相反的情况 here or here 但我没有找到如何从 Interop Color 转换为 System.Drawing.Color。
考虑到以下因素,我了解到 Interop 颜色以 RGB 表示:
RGBvalue = Red + 256*Green + 256*256*Blue
但是从 RGB 值中找到红绿蓝的值并不是很容易(例如如果值为 5652 我不知道如何找到红色是 20 和绿色是 22)。
您知道将 Microsoft.Office.Interop.Word/Excel/PowerPoint.颜色转换为 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);
}