如何从十六进制颜色代码(例如#FFDFD991
)中获取颜色?
我正在读取文件,并且正在获取十六进制颜色代码。我需要System.Windows.Media.Color
为十六进制颜色代码创建相应的实例。框架中是否有内置方法可以做到这一点?
#FF0000
是HTML(或十六进制)颜色代码,而不是哈希代码。请了解区别。
如何从十六进制颜色代码(例如#FFDFD991
)中获取颜色?
我正在读取文件,并且正在获取十六进制颜色代码。我需要System.Windows.Media.Color
为十六进制颜色代码创建相应的实例。框架中是否有内置方法可以做到这一点?
#FF0000
是HTML(或十六进制)颜色代码,而不是哈希代码。请了解区别。
Answers:
我假设这是一个ARGB代码...您是指System.Drawing.Color
还是System.Windows.Media.Color
?后者例如在WPF中使用。我还没有看到任何人提及它,所以以防万一您正在寻找它:
using System.Windows.Media;
Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
Color.FromArgb
在这种情况下,使用该方法可能会更容易。如果您使用浮点阿尔法,你必须用255乘以
假设您的意思是HTML类型的RGB代码(称为十六进制代码,例如#FFCC66),请使用ColorTranslator类:
System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");
但是,如果使用的是ARGB十六进制代码,则可以使用System.Windows.Media命名空间中的ColorConverter类:
Color col = ColorConverter.ConvertFromString("#FFDFD991") as Color;
//or = (Color) ColorConverter.ConvertFromString("#FFCC66") ;
如果您不想使用ColorTranslator,则可以轻松实现:
string colorcode = "#FFFFFF00";
int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
Color clr = Color.FromArgb(argb);
颜色代码只是ARGB值的十六进制表示。
编辑
如果您需要使用4个值而不是一个整数,则可以使用此值(结合多个注释):
string colorcode = "#FFFFFF00";
colorcode = colorcode.TrimStart('#');
Color col; // from System.Drawing or System.Windows.Media
if (colorcode.Length == 6)
col = Color.FromArgb(255, // hardcoded opaque
int.Parse(colorcode.Substring(0,2), NumberStyles.HexNumber),
int.Parse(colorcode.Substring(2,2), NumberStyles.HexNumber),
int.Parse(colorcode.Substring(4,2), NumberStyles.HexNumber));
else // assuming length of 8
col = Color.FromArgb(
int.Parse(colorcode.Substring(0, 2), NumberStyles.HexNumber),
int.Parse(colorcode.Substring(2, 2), NumberStyles.HexNumber),
int.Parse(colorcode.Substring(4, 2), NumberStyles.HexNumber),
int.Parse(colorcode.Substring(6, 2), NumberStyles.HexNumber));
注1:NumberStyles在System.Globalization中。
注意2:请提供您自己的错误检查(颜色代码应为6个或8个字符的十六进制值)
colorcode = colorcode.Replace("#", "")
简单地int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);
对r,g和b 使用诸如此类之后。别忘了用2表示r,4表示g和6表示b替换Substring的第一个参数-索引。
FromArgb
采用1个参数System.Drawing.Color
和4个参数System.Windows.Media.Color
还有一个简洁的扩展方法:
static class ExtensionMethods
{
public static Color ToColor(this uint argb)
{
return Color.FromArgb((byte)((argb & -16777216)>> 0x18),
(byte)((argb & 0xff0000)>> 0x10),
(byte)((argb & 0xff00) >> 8),
(byte)(argb & 0xff));
}
}
正在使用:
Color color = 0xFFDFD991.ToColor();
Color
正确转换十六进制。我使用了@too中的代码,并对其进行了修复。
& 0xFF
每次都可以对最终降档后的值进行处理,而不需要所有这些不同的值&
。
下面的三个变体给出完全相同的颜色。最后一个优点是可以在Visual Studio 2010 IDE中突出显示(可能是ReSharper在做),并使用适当的颜色。
var cc1 = System.Drawing.ColorTranslator.FromHtml("#479DEE");
var cc2 = System.Drawing.Color.FromArgb(0x479DEE);
var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);
System.Windows.Media.Color
。
private Color FromHex(string hex)
{
if (hex.StartsWith("#"))
hex = hex.Substring(1);
if (hex.Length != 6) throw new Exception("Color not valid");
return Color.FromArgb(
int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber));
}
我需要将十六进制颜色代码转换为System.Drawing.Color,特别是在WPF表单上作为背景的Alice Blue阴影,发现找到答案所需的时间比预期的长:
using System.Windows.Media;
-
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("#EFF3F7");
this.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(myColor.A, myColor.R, myColor.G, myColor.B));
如果要使用Windows Store应用程序执行此操作,请紧接着@Hans Kesting和@Jink回答:
string colorcode = "#FFEEDDCC";
int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
tData.DefaultData = Color.FromArgb((byte)((argb & -16777216) >> 0x18),
(byte)((argb & 0xff0000) >> 0x10),
(byte)((argb & 0xff00) >> 8),
(byte)(argb & 0xff));
对于任何试图从十六进制颜色代码转换为系统颜色的人来说,这篇文章都成了首选。因此,我想我将添加一个全面的解决方案,以处理6位(RGB)和8位(ARGB)十六进制值。
根据Microsoft的默认设置,当从RGB转换为ARGB值时
alpha值隐式为255(完全不透明)。
这意味着,通过将FF添加到6位(RGB)十六进制颜色代码,它将变成8位ARGB十六进制颜色代码。因此,可以创建一个处理ARGB和RGB十六进制并将其转换为适当的Color结构的简单方法。
public static System.Drawing.Color GetColorFromHexValue(string hex)
{
string cleanHex = hex.Replace("0x", "").TrimStart('#');
if (cleanHex.Length == 6)
{
//Affix fully opaque alpha hex value of FF (225)
cleanHex = "FF" + cleanHex;
}
int argb;
if (Int32.TryParse(cleanHex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out argb))
{
return System.Drawing.Color.FromArgb(argb);
}
//If method hasn't returned a color yet, then there's a problem
throw new ArgumentException("Invalid Hex value. Hex must be either an ARGB (8 digits) or RGB (6 digits)");
}
这是受汉斯·凯斯汀(Hans Kesting)的回答启发的。
您可以看到Silverlight / WPF使用十六进制值将椭圆设置为十六进制颜色:
your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)
采用
System.Drawing.Color.FromArgb(myHashCode);
int
?的转换一览
我在项目中使用了ColorDialog。ColorDialog有时返回“ Red”,“ Fhushia”,有时返回“ fff000”。我这样解决了这个问题,也许可以帮助别人。
SolidBrush guideLineColor;
if (inputColor.Any(c => char.IsDigit(c)))
{
string colorcode = inputColor;
int argbInputColor = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
guideLineColor = new SolidBrush(Color.FromArgb(argbInputColor));
}
else
{
Color col = Color.FromName(inputColor);
guideLineColor = new SolidBrush(col);
}
InputColor是ColorDialog的返回值。
感谢大家回答这个问题,对我有很大帮助。