Как получить цвет из шестнадцатеричного цветового кода с помощью .NET?
Как я могу получить цвет из шестнадцатеричного цветового кода (например, #FFDFD991
)?
Я читаю файл и получаю шестнадцатеричный код цвета. Мне нужно создать соответствующий экземпляр System.Windows.Media.Color
для шестнадцатеричного кода цвета. Есть ли встроенный метод в этой структуре?
Ответы
Ответ 1
Я предполагаю, что код ARGB... Вы имеете в виду System.Drawing.Color
или System.Windows.Media.Color
? Последнее используется, например, в WPF. Я еще не видел, чтобы кто-нибудь упоминал об этом, поэтому на всякий случай вы его искали:
using System.Windows.Media;
Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
Ответ 2
Предполагая, что вы имеете в виду коды типа RGB HTML (называемые шестнадцатеричными кодами, такие как # FFCC66), используйте класс ColorTranslator:
System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");
Если, однако, вы используете шестнадцатеричный код ARGB, вы можете использовать класс ColorConverter из пространства имен System.Windows.Media:
Color col = ColorConverter.ConvertFromString("#FFDFD991") as Color;
//or = (Color) ColorConverter.ConvertFromString("#FFCC66") ;
Ответ 3
Если вы не хотите использовать 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 символов)
Ответ 4
Существует также этот аккуратный метод расширения:
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();
Ответ 5
Три варианта ниже дают точно такой же цвет. Последний из них имеет преимущество в том, чтобы выделяться в 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);
Ответ 6
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));
}
Ответ 7
Вы можете использовать следующий код:
Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");
Ответ 8
Мне нужно было преобразовать оттенок Алисы Синего в качестве фона в форме WPF и обнаружил, что для ответа требуется больше времени:
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));
Ответ 9
Если вы хотите сделать это с помощью приложения для 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));
Ответ 10
Это сообщение стало goto для тех, кто пытается конвертировать из шестнадцатеричного цветового кода в системный цвет. Поэтому я подумал, что добавлю комплексное решение, которое касается шестнадцатеричных (RGB) и 8-значных (ARGB) шестнадцатеричных значений.
По умолчанию, согласно Microsoft, при преобразовании из значения RGB в ARGB
Значение альфа неявно 255 (полностью непрозрачное).
Это означает, что добавив FF к шестизначному (RGB) шестнадцатеричному цветному коду, он станет восьмизначным кодом цвета ARGB hex. Таким образом, может быть создан простой метод, который обрабатывает как ARGB, так и RGB hex и преобразует их в соответствующую структуру 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 a problem
throw new ArgumentException("Invalid Hex value. Hex must be either an ARGB (8 digits) or RGB (6 digits)");
}
Это было вдохновлено ответом Ганса Кестинга.
Ответ 11
использование
System.Drawing.Color.FromArgb(myHashCode);
Ответ 12
Вы можете видеть Silverlight/WPF устанавливает эллипс с шестнадцатеричным цветом для использования шестнадцатеричного значения:
your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)
Ответ 13
Если вы имеете в виду HashCode, как в .GetHashCode()
, я боюсь, что вы не можете вернуться. Хеш-функции не являются двунаправленными, вы можете идти только вперед, а не назад.
Следуйте указаниям Oded, если вам нужно получить цвет, основанный на шестнадцатеричном значении цвета.
Ответ 14
WPF:
using System.Windows.Media;
//hex to color
Color color = (Color)ColorConverter.ConvertFromString("#7AFF7A7A");
//color to hex
string hexcolor = color.ToString();