10

System.Drawing.Color 有一个 ToArgb() 方法来返回颜色的 Int 表示。
在 Silverlight 中,我认为我们必须使用 System.Windows.Media.Color。它有 A、R、G、B 成员,但没有返回单个值的方法。
如何实现 ToArgb()?在 System.Drawing.Color 中,ToArgb() 由

return (int) this.Value;  

System.Windows.Media.Color 有一个 FromArgb(byte A, byte R, byte G, byte B) 方法。如何分解 ToArgb() 返回的 Int 以与 FromArgb() 一起使用?

感谢您的任何指点...

4

3 回答 3

34

短而快。无需额外的方法调用,但具有快速操作。

// To integer
int iCol = (color.A << 24) | (color.R << 16) | (color.G << 8) | color.B;

// From integer
Color color = Color.FromArgb((byte)(iCol >> 24), 
                             (byte)(iCol >> 16), 
                             (byte)(iCol >> 8), 
                             (byte)(iCol));
于 2010-04-22T17:21:37.687 回答
5

听起来你在这里问了两个问题,让我再试一次。无论如何,您都需要考虑使用BitConverter该类。

这个页面

32 位 ARGB 值的字节顺序为 AARRGGBB。

因此,要实现ToArgb(),您可以编写一个扩展方法来执行以下操作:

public static int ToArgb(this System.Windows.Media.Color color)
{
   byte[] bytes = new byte[] { color.A, color.R, color.G, color.B };
   return BitConverter.ToInt32(bytes, 0);
}

并且要“分解 ToArgb() 返回的 Int 以与 FromArgb() 一起使用”,您可以这样做:

byte[] bytes = BitConverter.GetBytes(myColor.ToArgb());
byte aVal = bytes[0];
byte rVal = bytes[1];
byte gVal = bytes[2];
byte bVal = bytes[3];  

Color myNewColor = Color.FromArgb(aVal, rVal, gVal, bVal);

希望这可以帮助。

于 2010-04-22T15:52:28.517 回答
1

只是一个简短的说明:

在直接调用 color.ToArgb() 而不是在标记的答案中使用位移操作时,检索“颜色”对象的整数表示对我来说似乎快了 4 倍。因此,如果您有权访问 .ToArgb(),请始终使用它!

线程创建者表示他无法访问它,所以标记的答案当然仍然是正确的,请不要被其中声称的“快速操作”弄糊涂。

请记住:Color 实例的颜色在内部已经保存为 int 值,因此 ToArgb() 只是返回它,同时访问它的每个单个字节(通过属性 .A、.R.、.G.、 .B)然后通过位移重新组合它们有点绕圈子移动。

于 2013-04-03T20:52:40.397 回答