Преобразование .Net Color Objects в HEX-коды и обратно
В соответствии с заголовком вопроса, как я могу взять шестнадцатеричный код и преобразовать его в объект .Net Color, и сделать это другим способом?
Я googled и продолжаю получать то же самое, что не работает.
ColorTranslator.ToHtml(renderedChart.ForeColor)
Что возвращает название цвета, как в "Белом" вместо "#ffffff"! Делать это по-другому, кажется, имеют нечетные результаты, только работая некоторое время...
Ответы
Ответ 1
Что-то вроде:
Color color = Color.Red;
string colorString = string.Format("#{0:X2}{1:X2}{2:X2}",
color.R, color.G, color.B);
Выполнение этого в другом случае немного сложнее, поскольку # F00 - это допустимый цвет html (что означает полный красный цвет), но он по-прежнему можно использовать с помощью regex, вот небольшой класс образцов:
using System;
using System.Diagnostics;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Collections.Generic;
public static class HtmlColors
{
public static string ToHtmlHexadecimal(this Color color)
{
return string.Format("#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
}
static Regex htmlColorRegex = new Regex(
@"^#((?'R'[0-9a-f]{2})(?'G'[0-9a-f]{2})(?'B'[0-9a-f]{2}))"
+ @"|((?'R'[0-9a-f])(?'G'[0-9a-f])(?'B'[0-9a-f]))$",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
public static Color FromHtmlHexadecimal(string colorString)
{
if (colorString == null)
{
throw new ArgumentNullException("colorString");
}
var match = htmlColorRegex.Match(colorString);
if (!match.Success)
{
var msg = "The string \"{0}\" doesn't represent"
msg += "a valid HTML hexadecimal color";
msg = string.Format(msg, colorString);
throw new ArgumentException(msg,
"colorString");
}
return Color.FromArgb(
ColorComponentToValue(match.Groups["R"].Value),
ColorComponentToValue(match.Groups["G"].Value),
ColorComponentToValue(match.Groups["B"].Value));
}
static int ColorComponentToValue(string component)
{
Debug.Assert(component != null);
Debug.Assert(component.Length > 0);
Debug.Assert(component.Length <= 2);
if (component.Length == 1)
{
component += component;
}
return int.Parse(component,
System.Globalization.NumberStyles.HexNumber);
}
}
Использование:
// Display #FF0000
Console.WriteLine(Color.Red.ToHtmlHexadecimal());
// Display #00FF00
Console.WriteLine(HtmlColors.FromHtmlHexadecimal("#0F0").ToHtmlHexadecimal());
// Display #FAF0FE
Console.WriteLine(HtmlColors.FromHtmlHexadecimal("#FAF0FE").ToHtmlHexadecimal());
Ответ 2
"Белый" - это допустимый цвет HTML. См. ColorTranslator.ToHtml
:
Этот метод переводит цвет структура в строковое представление цвета HTML. Это обычно используемое имя цвета, например "Красный", "Синий" или "Зеленый", а не строка представление числового цвета значение, например "FF33AA".
Если ваш цвет не может быть отображен в строку цвета HTML, этот метод вернет действительный шестнадцатеричный цвет. См. Этот пример:
using System;
using System.Drawing;
class Program
{
static void Main()
{
Console.WriteLine(ColorTranslator.ToHtml(Color.White));
Console.WriteLine(ColorTranslator.ToHtml(Color.FromArgb(32,67,89)));
}
}
Ответ 3
Если вы преобразуете цвет обратно с помощью {ColorTranslator.FromHTML}, "Белый" является допустимой строкой для цвета HTML. Но я обнаружил, что эта реализация нуждается в символе # перед строкой, которая представляет цвет, если он не является обычным (например, он работает с White и #FFFFFF, но не С#White или FFFFFF).
Поэтому я попытался поместить преобразование внутри блока try/catch, сделав преобразование, добавив '#' в строку, и если оно выбрало исключение, я поймал его и сделал преобразование без #.
Ответ 4
Я написал собственное расширение .net для простого преобразования из hex в integer и integer (ARGB) в цветное и наоборот:
Imports System.Drawing
Imports System.Runtime.CompilerServices
Public Module ColorsExt
Private Sub example_for_usage()
Dim hex As String
Dim c As Color = Color.Red
hex = c.ToHexString() 'Converts color to hexadecimal string'
c = hex.ToIntegerFromHex().ToColor() 'Gets Integer value from the hex string and simply convert it to Color()'
End Sub
<Extension> _
Public Function ToColor(ByVal argb As Integer) As Color
Return Color.FromArgb(argb)
End Function
<Extension> _
Public Function ToIntegerFromHex(ByVal argb_hex_string As String) As Integer
Return Int("&H" + argb_hex_string)
End Function
<Extension> _
Public Function ToHexString(ByVal c As Color) As String
Return String.Format("{0:X2}{1:X2}{2:X2}{3:X2}", c.A, c.R, c.G, c.B)
End Function
<Extension> _
Public Sub FromHexString(ByVal c As Color, ByVal hex As String)
c = hex.ToIntegerFromHex().ToColor()
End Sub
<Extension> _
Public Function ToHexString(ByVal c As Integer) As String
Return String.Format("{0:X8}", c)
End Function
<Extension> _
Public Function ToArgb(ByVal c As Color) As Integer
Return (c.A * &HFF0000) + (c.R * &HFF00) + (c.G * &HFF) + (c.B)
End Function
End Module
Ответ 5
Посмотрите на Color.ToARGB()
http://msdn.microsoft.com/en-us/library/system.drawing.color.toargb.aspx