C# 实现ToArgb()

C# 实现ToArgb(),c#,silverlight,colors,argb,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

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()一起使用


谢谢你的指点…

听起来你在问两个问题,让我再试试。无论如何,您都需要研究如何使用该类

发件人:

32位ARGB的字节顺序 值为AARGGBB

因此,要实现
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);

希望这有帮助。

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

// 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));
//转换为整数
int iCol=(颜色A>16),
(字节)(iCol>>8),
(字节)(iCol));
请注意:

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

线程创建者声明他无法访问它,因此标记的答案当然仍然正确,因为不要被其中声称的“快速操作”所迷惑


请记住:color实例的颜色在内部已经保存为int值,因此ToArgb()只是返回它,同时访问它的每个字节(通过properties.A、.R、.G、.B)然后通过位移位对它们进行重新组合有点像是在循环中移动。

System.Windows.Media.Color既没有ToArgb方法,也没有将颜色存储为int。似乎您没有阅读这个问题。我想您的数组是反向的<代码>32位ARGB值的字节顺序为AARRGGBB。表示8位十六进制uint的数字。在little endian(可能是更常见的情况)中,您的代码是错误的,蓝色是第一位的。@Zarat,对于与英特尔兼容的芯片,您是正确的。BitConverter不会更改字节顺序的尾数,因此同一代码的字节顺序可能会因尾数顺序的不同而有所不同。这会导致VB.NET中出现OverflowException<代码>CByte((iCol>>24)和&HFF)起作用。