实现ToArgb()

时间:2010-04-22 15:47:02

标签: c# silverlight colors argb

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(字节A,字节R,字节G,字节B)方法。如何分解ToArgb()返回的Int以与FromArgb()一起使用?

感谢您的任何指示...

3 个答案:

答案 0 :(得分:31)

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

// 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));

答案 1 :(得分:5)

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

来自this page

  

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

因此,要实现ToArgb(),您可以编写一个extension method来执行以下操作:

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);

希望这有帮助。

答案 2 :(得分:1)

简短说明:

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

线程创建者表示他无法访问它,所以当然标记的答案仍然是正确的,juse不会被声称的“快速操作”混淆。

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