2016-06-29 3 views
1

У меня есть цвет #cccc00, который я извлекаю из базы данных и использую для рисования фона элемента управления.Почему System.Drawing.Color добавляет 'ff' в шестнадцатеричный код?

Поскольку я не знаю, если строка будет шестигранной или название цвета (т.е. Yellow или # cccc00.), Я проверяю строку, например, так:

string color = "#cccc00"; 
if (color.IndexOf('#') >= 0) 
{ 
    Color _color = System.Drawing.ColorTranslator.FromHtml(color); 
    buttonSelector.BackColor = _color; 
    // _color.Name now equals ffcccc00 
} 

Это прекрасно работает. Проблема в том, что я также использую эту строку (цвет) для поиска таблицы sql. Дело в том, что _color.Name возвращает ffcccc00, поэтому поиск ничего не возвращает, потому что таблица sql имеет его как # cccc00.

Таким образом, без необходимости изменять строку, удаляя/заменяя ff, существует ли способ получить значение в том же формате, который я использовал для установки обратного цвета элемента управления? Я предпочитаю не удалять/заменять, потому что он может использовать hex или фактическое имя цвета.

Спасибо.

+0

не уровень прозрачности? как rgba (r, g, b, a)? –

+0

Я не уверен, что вы имеете в виду. – rbhat

+0

Я имею в виду альфа-канал цвета, это не 4 часть –

ответ

3

Первый байт (в вашем случае FF) указывает цвет прозрачность. Другие три байта описывают цвет, в зависимости от кодировки он может быть RGB, например.

Так код FF FFFFFF, показывает прозрачность FFFFFF основных цветов.

Где FF обозначает наиболее интенсивный цвет, а 00 обозначает полную прозрачность.

+1

Просто для завершения ответа: FF означает, что он не прозрачен вообще, где 00 означает полностью прозрачный. –

+0

Дополнительно, если вам нужна ваша собственная функция конвертации в код цвета HTML без прозрачности, посмотрите здесь.http: //stackoverflow.com/a/14710792/6439999 –

0

Это альфа-компонент, то есть прозрачность, цвета. Если вам нужен согласованный формат, вы можете создать его самостоятельно из компонентов R, G и B, которые вы конвертируете в шестнадцатеричные.

0

Таким образом, без необходимости изменять строку, удаляя/заменяя ff, есть способ получить значение в том же формате, который я использовал для установки обратного цвета элемента управления?

Ну, вы использовали метод ColorTranslator.FromHtm, чтобы получить значение цвета из строки. Чтобы сделать обратное, вы можете использовать ColorTranslator.ToHtml.

Просто убедитесь, что вы используете регистр без учета регистра, потому что метод ToHtml делает верхний регистр шестнадцатеричным значением.

Например:

string colorA = "#cccc00"; 
Color color = ColorTranslator.FromHtml(colorA); 
string colorB = ColorTranslator.ToHtml(color); // "#CCCC00" 

но

string colorA = "AliceBlue"; 
Color color = ColorTranslator.FromHtml(colorA); 
string colorB = ColorTranslator.ToHtml(color); // "AliceBlue" 
0

Это альфа-канал управления цветом. Он хранится в 8 бит, как и красные, зеленые и синие значения компонентов. Так же, как красный, зеленый и синий диапазоны от 0 (0x00) до 255 (0xFF), так может быть и альфа-канал.

Цветовые значения с альфа-каналом, в действительности, 32 бита длиной (4 байта × 8 бит/байт), вместо обычных 24-разрядных цветов, которые вы, вероятно, использовать для из Интернета.

Альфа-канал обеспечивает эффекты прозрачности. Другими словами, он контролирует, как цвет смешивается с фоном. Значение альфа-канала 0 (0x00) означает, что цвет полностью прозрачен - в принципе, цвета нет. Значение альфа-канала 255 (0xFF) означает, что цвет полностью непрозрачен. 24-битные цвета всегда полностью непрозрачны, потому что у них нет альфа-канала.

Это означает, что # 224466 является точно такого же цвета, как # FF224466.

Я понимаю, но я не могу использовать # cccc00ff как цвет, потому что это совершенно другой цвет для # cccc00.

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

Порядок: #AARRGGBB. Значение альфа-канала сохраняется в старшем байте, красный - следующий, затем зеленый и, наконец, синий в младшем байте. В этом порядке нет ничего святого, но он стал de facto. (Вы также иногда можете найти #AABBGGRR.)

Если вам не нужна информация о альфа-каналах и вы хотите просто работать с 24-битными цветами, вы можете обрезать старший байт, который содержит значение альфа-канала. Или вы можете просто сохранить это в базе данных. Это не имеет значения, поскольку они представляют один и тот же цвет.

Вы можете разобрать значения от себя, не обращая внимания на значение (я) альфа-канала, в случае необходимости:

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

Color HexStringToRgbColor(String str) 
{ 
    int argb = Int32.Parse(str.Replace("#", ""), NumberStyles.HexNumber); 
    return Color.FromArgb((argb & 0x00FF0000) >> 16, /* red component */ 
          (argb & 0x0000FF00) >> 8, /* green component */ 
          (argb & 0x000000FF));  /* blue component */ 
} 
Смежные вопросы