题
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,byte r,byte g,byte b)方法。如何将toargb()返回的INT分解为与FromArgb()一起使用?
感谢您的任何指示...
解决方案
短而快。没有额外的方法调用,但可以通过快速操作。
// 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));
其他提示
听起来您在这里问两个问题,让我再次刺伤它。无论如何,您都需要考虑使用 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);
希望这可以帮助。
只是一个简短的说明:
当直接调用color.toargb()而不是在标记的答案中使用bitshift-oserations时,“颜色”对象的整数表示对我来说更快4倍。因此,如果您可以访问.toargb(),请务必使用它!
线程创建者表示他无法访问它,因此当然,标记的答案仍然正确,Juse不要对其中声称的“快速操作”感到困惑。
请记住:颜色实例的颜色内部已保存为int值,因此toargb()只是返回它,同时将其访问其每个字节的每个字节访问(通过properties .a,.r。,.g。,.g。,.g。,.g。 。