C # Преобразование delphi TColor в цвет (Hex) - PullRequest
5 голосов
/ 29 ноября 2011

enter image description here

Эти номера хранятся в базе данных. Они происходят из кода Delphi. Хотя я предполагаю, что они следуют некоторому стандарту. Я пытался Color.FromArgb(255);

Но я точно знаю, что первым является КРАСНЫЙ (со стороны delphi), где, как и в ASP.NET, он считает своим голубым Color [A=0, R=0, G=0, B=255]

Я все равно хочу эти числа в шестнадцатеричном формате. То есть # 000000, # FFFF99 и т. Д. И т. Д.

Кто-нибудь знает, как преобразовать эти целые числа (см. Рисунок в БД) в шестнадцатеричное.

Ответы [ 2 ]

20 голосов
/ 29 ноября 2011

Цвета Delphi (TColor) равны XXBBGGRR, если не из палитры или специального цвета.

См. эту статью для более подробной информации о формате (и других особых случаях). Статья , указанная Christian.K , также содержит некоторые подробности об особых случаях.

Стандартные цвета

Чтобы преобразовать в стандартный цвет, вы должны использовать что-то вроде:

var color = Color.FromArgb(0xFF, c & 0xFF, (c >> 8) & 0xFF, (c >> 16) & 0xFF);

Для преобразования в гекс:

string ColorToHex(Color color)
{
    return string.Format("#{0:X2}{1:X2}{2:X2}",
        color.R, color.G, color.B);
}

Системные цвета

Для системных цветов (отрицательные значения в вашей базе данных) это просто константы окон, маскируемые 0x80000000.

Благодарю Дэвида Хеффернана за информацию.

Пример кода

Color DelphiColorToColor(uint delphiColor)
{
    switch((delphiColor >> 24) & 0xFF)
    {
        case 0x01: // Indexed
        case 0xFF: // Error
            return Color.Transparent;

        case 0x80: // System
            return Color.FromKnownColor((KnownColor)(delphiColor & 0xFFFFFF));

        default:
            var r = (int)(delphiColor & 0xFF);
            var g = (int)((delphiColor >> 8) & 0xFF);
            var b = (int)((delphiColor >> 16) & 0xFF);
            return Color.FromArgb(r, g, b);
    }
}

void Main()
{
    unchecked
    {
        Console.WriteLine(DelphiColorToColor((uint)(-2147483646)));
        Console.WriteLine(DelphiColorToColor(
                (uint)KnownColor.ActiveCaption | 0x80000000
            ));
        Console.WriteLine(DelphiColorToColor(0x00FF8000));
    }
}
3 голосов
/ 29 ноября 2011

Похоже, что числа являются представлением base-10 Delphi TColor значения .

Кажется, что сам Delphi предоставляет некоторые вспомогательные функции (например, GetRValue) для извлечения соответствующего чтения, зеленые и синие значения.Вы должны написать что-то похожее в c # самостоятельно.

Имея значения, вы можете собрать их в шестнадцатеричную строку.

string.Format("#{0:X2}{1:X2}{2:X2}", redComponent, greenComponent, blueComponent);

Просто преобразовать целочисленное значение в шестнадцатеричную строку, дополненную илинет, скорее всего, не будет делать правильные вещи.

ОБНОВЛЕНИЕ , как указывает комментатор Джеймс Л., порядок компонентов на самом деле отличается для / в Delphi.Для создания TColor -подобного значения порядок должен быть:

string.Format("#{0:X2}{1:X2}{2:X2}", blueComponent, greenComponent, redComponent);
...