C # Hex Code Генератор теневых градиентов - PullRequest
1 голос
/ 23 февраля 2012

Я посмотрел на здесь , но я не совсем понимаю, что там происходит. Я совершенно новичок в c # и пытаюсь создать генератор градиентов HEX-кода. Мне дают две строки шестнадцатеричных кодов с кучей шагов вниз / вверх.

например:

black: 000000 to grey: 666666
with a step of 10. 

Это сгенерирует 10 различных HEX-кодов, которые построят мне градиент из этих двух точек. Мне было интересно, как мне поступить, или кто-нибудь может дать мне алгоритм, как это сделать.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Простые градиенты выполняют линейное деление диапазона на равные части.

Например, если мы смотрим только на красный компонент и хотим перейти от 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 ввода.
0 голосов
/ 23 февраля 2012

Очень простым методом будет вычисление промежуточных значений красного, зеленого и синего компонентов ... что-то вроде:

Dim tOriginHexColor As String = "000000"
Dim tTargetHexColor As String = "666666"
Dim tSteps As Byte = 10

Dim tOriginColor as Color = ColorTranslator.FromHtml(tOriginHexColor)
Dim tTargetColor As Color = ColorTranslator.FromHtml(tTargetHexColor)

Dim tRedStep As Byte = tTargetColor.R - tOriginColor.R
Dim tBlueStep As Byte = tTargetColor.R - tOriginColor.B
Dim tGreenStep As Byte = tTargetColor.R - tOriginColor.G

For tIndex As Int16 = 0 To tSteps - 1
  Debug.Print(ColorTranslator.ToHtml(Color.FromArgb(tOriginColor.R + tRedStep, tOriginColor.G + tGreenStep, tOriginColor.B + tBlueStep)))
Next
...