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()一起使用?
感谢您的任何指示...
答案 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)然后通过比特换档重新组合它们有点像一个圆圈。