如何从十六进制颜色代码(例如#FFDFD991)中获得颜色?
我正在读取一个文件,并得到一个十六进制的颜色代码。我需要为十六进制颜色代码创建相应的System.Windows.Media.Color实例。框架中是否有一个内置的方法来做到这一点?
如何从十六进制颜色代码(例如#FFDFD991)中获得颜色?
我正在读取一个文件,并得到一个十六进制的颜色代码。我需要为十六进制颜色代码创建相应的System.Windows.Media.Color实例。框架中是否有一个内置的方法来做到这一点?
当前回答
我在我的项目中使用了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的返回值。
谢谢大家回答这个问题。这对我帮助很大。
其他回答
你可以看到Silverlight/WPF用十六进制的颜色设置椭圆来使用十六进制值:
your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)
我猜这是ARGB代码…你指的是system。drawing。color还是system。windows。media。color ?例如,后者在WPF中使用。我还没见过有人提到它,所以以防你在找它:
using System.Windows.Media;
Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
我在我的项目中使用了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的返回值。
谢谢大家回答这个问题。这对我帮助很大。
如果你想用Windows商店应用程序,后面跟着@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));
这里已经有很多答案了。
简而言之,我支持那些建议使用System.Drawing.ColorTranslator的人。
我知道有些人想避免System. windows . media,所以有另一个解决方案,因为你想有一个System. drawing . color,你应该有一个对System的引用。绘图已经在您的项目中。
所以简而言之:如果可以,就使用框架。
一个更完整的本地解决方案
因此,如果出于某种原因你想避免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。全球化我相信你会找到一个代码剪辑解析十六进制符号。
测试
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"));
}
注: 可以随意删除这些参数,它们只是想说明如何调整函数来处理格式错误和默认值。
最大功率。 目前错误消息不是很有描述性