Простые градиенты выполняют линейное деление диапазона на равные части.
Например, если мы смотрим только на красный компонент и хотим перейти от 0 до 250 (десятичное число) за 5 шаговтогда каждая секция будет ((250 - 0) / (5 - 1)) = 62,5.
Тогда значения будут: 0, 62,5, 125, 187,5 и 250.
Все, что вам нужно сделать сейчас, это повторить это линейное деление для каждого компонента.
Об альфа-канале
Обратите внимание, что структура данных Color
содержит значение альфа-канала, которое не отражается в случае вашего 0x666666.Если вы учитываете свое значение шаблона 0xRRGGBB и предполагаете, что альфа-канал будет 0xFF (то есть полностью непрозрачным), то все хорошо.
Но если вы хотите включить альфа-канал в свой градиент (как видно во всех примерах здесь), то для шаблона 0xAARRGGBB, в вашем случае альфа-канал будет 0, что означает, что цвет будет полностью прозрачным (невидимым).
Contructing Color
от uint
Одна из неприятных особенностей Color.FromArgb()
заключается в том, что он принимает значение int
вместо uint
.Таким образом, например, при подаче 0xFF666666 будет получено исключение.
Чтобы преодолеть это, нам нужно испачкать руки с помощью небольшого сдвига:
private static Color GetColorFromArgb( uint colorValue )
{
Color color = Color.FromArgb(
(int)((colorValue & 0xFF000000) >> 24),
(int)((colorValue & 0x00FF0000) >> 16),
(int)((colorValue & 0x0000FF00) >> 8),
(int)((colorValue & 0x000000FF))
);
return color;
}
РЕДАКТИРОВАТЬ: GetColorFromArgb
Объяснил
Чтобы ответить на вопрос «как бы вы преобразовали шестнадцатеричный код в RGB?», Тогда GetColorFromArgb
уже преобразует шестнадцатеричное число в R, G, B, но также добавляет альфа-информация о канале.
Ввод для GetColorFromArgb
- это 32-разрядное целое число без знака.Если мы посмотрим на его шестнадцатеричное представление, то его шаблон: 0xAARRBBGG.
GetColorFromArgb
извлекает компоненты один за другим, используя битовые маски и битовые сдвиги, а затем вызывает Color.FromArgb(int a, int r, int g, int b)
.
Вот более сложная версия GetColorFromArgb
:
private static Color GetColorFromArgb(uint colorValue)
{
int a = (int)((colorValue & 0xFF000000) >> 24);
int r = (int)((colorValue & 0x00FF0000) >> 16);
int g = (int)((colorValue & 0x0000FF00) >> 8);
int b = (int)(colorValue & 0x000000FF);
Color color = Color.FromArgb(a, r, g, b);
return color;
}
Если вопрос заключался в том, как игнорировать альфа-канал, то вы можете создать метод GetColorFromRGB()
, который не извлекаетальфа-информация и вместо этого передает фиксированное значение:
private static Color GetColorFromRGB(int colorValue)
{
int a = 0xFF; // Fully opaque
int r = (int)((colorValue & 0x00FF0000) >> 16);
int g = (int)((colorValue & 0x0000FF00) >> 8);
int b = (int)(colorValue & 0x000000FF);
Color color = Color.FromArgb(a, r, g, b);
return color;
}
- Обратите внимание, что, поскольку вы используете значения 0xRRGGBB, вы можете использовать
int
вместо uint
ввода.