Конвертировать шестнадцатеричную строку ARGB в RGB - PullRequest
0 голосов
/ 26 октября 2019

Мой вопрос очень похож на Преобразование цвета RGBA в RGB только у меня есть шестнадцатеричная строка, а не байтовые значения цвета.

Я работаю с EPPlus и яхотите преобразовать цвета фона ячейки в цвета HTML.
Цвет фона фона ячейки исходит из этого свойства ColorType.Rgb .
Примечание: Свойство содержит Rgb, но в качестве документаговорит, что на самом деле это Argb.

Во время тестирования у меня есть одна красная ячейка с гексом Argb #FFFF0000, но, насколько я понимаю, в HTML альфа не поддерживается, а гекс Rgb для красного - #FF0000.

Мне нужно сначала преобразовать шестнадцатеричные строки в байтовые значения, выполнить вычисление из предыдущего ответа, преобразовать Rgb-байты в шестнадцатеричную строку.

Спасибо

Ответы [ 3 ]

1 голос
/ 26 октября 2019

Вы можете преобразовать шестнадцатеричную строку в целочисленное значение, используя основание 16 как

int argb = Convert.ToInt32("0xFFFF0000", 16);

, а затем создать свой цвет с помощью

Color c = Color.FromArgb(argb);

, наконец, вы можете получить новую шестнадцатеричную строкутолько со значениями RGB с

string rgb = $"#{c.R:X2}{c.G:X2}{c.B:X2}";
0 голосов
/ 27 октября 2019

Примечание: Хотя это решение и выдает правильное значение цвета HTML, это значение необязательно должно быть шестнадцатеричной строкой RGB, как описано ниже. Это также значительно медленнее, чем мое другое решение.

Третье решение будет использовать класс ColorTranslator, который работает, потому что:

  • Метод ColorTranslator.FromHtml() использует ColorConverter.ConvertFrom для внутреннего использования (который может анализировать шестнадцатеричные значения ARGB).

  • Затем ColorTranslator.ToHtml просто игнорирует альфа-значениеи использует только значения RGB для генерации строки 1 .

Пример:

Color c = ColorTranslator.FromHtml("#FFFF0000");
string rgb = ColorTranslator.ToHtml(c);

А вот некоторый тестовый код дляпокажите, что это решение будет работать со всеми возможными шестнадцатеричными значениями ARGB:

try
{
    // Incrementing by 5 to save time. We can use `++` to cover all possible values
    // but it will take a long time to execute.
    for (int a = 0; a <= 255; a += 5)
        for (int r = 0; r <= 255; r += 5)
            for (int g = 0; g <= 255; g += 5)
                for (int b = 0; b <= 255; b += 5)
                    ColorTranslator.FromHtml($"#{a.ToString("X2")}{r.ToString("X2")}" +
                                             $"{g.ToString("X2")}{b.ToString("X2")}");
    Console.WriteLine("All is good!");
}
catch (FormatException ex)
{
    Console.WriteLine($"Failed. Message='{ex.Message}'");
}

1 Однако имейте в виду, что ColorTranslator.ToHtml() не обязательновернуть шестнадцатеричную строку RGB. Он пытается вернуть имя цвета, если у цвета есть известное имя цвета (которое работает для HTML), в противном случае он прибегает к шестнадцатеричным значениям RGB в формате #RRGGBB.

0 голосов
/ 26 октября 2019

Почему бы просто:

string argb = "#FFFF0000";
string rgb = argb.Remove(1, 2);

.., поскольку формат шестнадцатеричной строки ARGB равен #AARRGGBB ( source ). Это наиболее простое решение (и намного более быстрое, чем решения, основанные на преобразованиях).

Чтобы охватить случай 4 цифр вместо 8, вы можете использовать что-то вроде:

int alphaDigits = (argb.Length == 9 ? 2 : 1);
string rgb = argb.Remove(1, alphaDigits);
...