如何使用. NET从十六进制颜色代码中获取颜色?

如何从十六进制颜色代码(例如#FFDFD991)中获取颜色?

我正在读取一个文件并获得十六进制颜色代码。我需要为十六进制颜色代码创建相应的System.Windows.Media.Color实例。框架中是否有内置方法来执行此操作?

630017 次浏览

假设您指的是超文本标记语言类型RGB代码(称为十六进制代码,例如#FFCC66),请使用色彩翻译工具类:

System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");

但是,如果您使用的是ARGB十六进制代码,您可以使用System. Windows. Media命名空间中的色彩转换器类:

Color col = ColorConverter.ConvertFromString("#FFDFD991") as Color;
//or      = (Color) ColorConverter.ConvertFromString("#FFCC66") ;

使用

System.Drawing.Color.FromArgb(myHashCode);

如果你的意思是.GetHashCode()中的HashCode,恐怕你不能回去。哈希函数不是双向的,你只能前进,不能后退。

如果您需要根据颜色的十六进制值获取颜色,请遵循Oded的建议。

如果你不想使用Color Translator,你可以很容易地做到这一点:

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个字符的十六进制值)

我假设这是一个ARGB代码……你指的是System.Drawing.Color还是System.Windows.Media.Color?例如,后者在WPF中使用。我还没有看到有人提到它,所以以防万一你在找它:

using System.Windows.Media;


Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");

您可以使用以下代码:

Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");

还有这个简洁的小扩展方法:

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

您可以看到Silverlight/WPF将椭圆设置为十六进制颜色使用十六进制值:

your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)

下面的三个变体给出了完全相同的颜色。最后一个好处是在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);

WPF:

using System.Windows.Media;


//hex to color
Color color = (Color)ColorConverter.ConvertFromString("#7AFF7A7A");


//color to hex
string hexcolor = color.ToString();

这篇文章已经成为任何试图从十六进制颜色代码转换为系统颜色的人的首选。因此,我想我会添加一个全面的解决方案,处理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)");


}

这是受汉斯·凯斯廷答案的启发。

如果您想使用Windows Store应用程序执行此操作,请关注@汉斯·凯斯廷和@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));
    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));
}

我需要将HEX颜色代码转换为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));

我在我的项目中使用了科罗拉多对话框。科罗拉多对话框有时会返回“红色”、“福希亚”,有时会返回“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是科罗拉多对话框的返回值。

谢谢大家回答这个问题,对我的帮助很大。

asp.net:

color_black = (Color)new ColorConverter().ConvertFromString("#FF76B3");

这里已经有很多答案了。

简而言之,我支持那些建议使用System.Drawing.ColorTranslator的人。

我知道有些人想避免System.Windows.Media,所以有另一个解决方案,既然你想有一个System.Drawing.Color,你应该在你的项目中已经引用了System.Drawing

简而言之:使用框架如果可以的话。

更完整的原生解决方案

因此,如果出于某种原因,您想避免System.Drawing.ColorTranslator并创建自己的实现,您至少应该让它尊重规格

所以这是一个#RGB#RGBA速记和扩展颜色定义的解决方案

    public static Color ParseHtmlColor(string htmlColor) => Color.FromArgb(HtmlColorToArgb(htmlColor));


public static int HtmlColorToArgb(string htmlColor, bool requireHexSpecified = false, int defaultAlpha = 0xFF)
{


if (string.IsNullOrEmpty(htmlColor))
{
throw new ArgumentNullException(nameof(htmlColor));
}


if (!htmlColor.StartsWith("#") && requireHexSpecified)
{
throw new ArgumentException($"Provided parameter '{htmlColor}' is not valid");
}


htmlColor = htmlColor.TrimStart('#');
        



// int[] symbols
var symbolCount = htmlColor.Length;
var value = int.Parse(htmlColor, System.Globalization.NumberStyles.HexNumber);
switch (symbolCount)
{
case 3: // RGB short hand
{
return defaultAlpha << 24
| (value & 0xF)
| (value & 0xF) << 4
| (value & 0xF0) << 4
| (value & 0xF0) << 8
| (value & 0xF00) << 8
| (value & 0xF00) << 12
;
}
case 4: // RGBA short hand
{
// Inline alpha swap
return   (value & 0xF) << 24
| (value & 0xF) << 28
| (value & 0xF0) >> 4
| (value & 0xF0)
| (value & 0xF00)
| (value & 0xF00) << 4
| (value & 0xF000) << 4
| (value & 0xF000) << 8
;
}
case 6: // RGB complete definition
{
return defaultAlpha << 24 | value;
}
case 8: // RGBA complete definition
{
// Alpha swap
return (value & 0xFF) << 24 | (value >> 8);
}
default:
throw new FormatException("Invalid HTML Color");
}
}

如果您出于某种原因不想使用System.Globalization,我相信您会找到一个用于解析十六进制符号的代码。

测试

    public static void TestColors()
{
foreach (var testCase in TestCases) TestColor(testCase);
}


static string[] TestCases = new string[] {
"111",
"FFF",
"17A",
"F52",
"444F",
"2348",
"4320",
"121212",
"808080",
"FFFFFF",
"A0E0C0",
"0A070B",
"FFFFFFFF",
"808080FF",
"40807710"
};


public static void TestColor(string htmlColor)
{
Console.Write($" {htmlColor} -> ");
var color = ParseHtmlColor(htmlColor);
Console.WriteLine("0x" + color.ToArgb().ToString("X"));
}

附言: 随意删除参数,他们只是想展示如何调整函数来处理格式错误和默认值。

附: 目前错误消息不是很具描述性

您可以使用Color Conver. ConvertFromString(string)方法将字符串(十六进制)转换为颜色。

示例:(这适用于ARGB,例如“#FF1E1E1E”。

Control.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1E1E1E"));

对于任何Xamarin开发人员,您需要

  1. 指定颜色类型以防止Cast异常假设您正在谈论Xamarin. Form. Color
  2. 创建一个科罗拉多类型的对象
var conv = new System.Drawing.ColorConverter();
var color = (System.Drawing.Color)conv.ConvertFromString("#FF1D65AE");
  • XNA/Monogame(Microsoft. Xna. Framework. Color)。
  • 适用于6或8(带alpha)字符十六进制字符串
  • 可能有更好的替代方案(位掩蔽/移位)。
    using Microsoft.Xna.Framework;
using System.Globalization;
    

public static class ColorBuilder
{
public static Color FromHex(string color)
{
var hex = color.Replace("#", string.Empty);
var h = NumberStyles.HexNumber;


var r = int.Parse(hex.Substring(0, 2), h);
var g = int.Parse(hex.Substring(2, 2), h);
var b = int.Parse(hex.Substring(4, 2), h);
var a = 255;


if (hex.Length == 8)
{
a = int.Parse(hex.Substring(6, 2), h);
}
 

return new Color(r, g, b, a);
}
}
    

//create a blue color
var color = ColorBuilder.FromHex("#2733C5"); //or ColorBuilder.FromHex("2733C5");
    

//create a blue color with 50% alpha
var colorTrans = ColorBuilder.FromHex("#2733C580");