Как получить градиент цвета радуги в C #?

Я хотел бы иметь перечисление цветов на основе цветов радуги (красный ... желтый ... зеленый ... синий ...).

Я вижу в основном два способа сделать это:

  1. Создайте справочную таблицу, содержащую некоторые важные справочные цвета, и выполните интерполяцию между ними. Мне совсем не нравится эта идея.

  2. Примените более или менее причудливую математику. Наверное, меньше, но я не совсем понимаю, как это работает. Любые идеи?

(О, и пока я провел небольшое исследование, я не нашел хороших результатов. Если этот вопрос уже был опубликован, просто укажите мне место, и я удалю его.)

Изменить: я бы предпочел, чтобы это было независимо от используемой технологии для отображения градиента. Например, что-то вроде GetRainbowColor (float f) с f в диапазоне от 0 (красный) до 1 (фиолетовый) отлично подойдет.


person mafu    schedule 18.02.2010    source источник
comment
WPF? WinForms? ASP.NET? Ответ может измениться в зависимости от технологии.   -  person Mike Two    schedule 18.02.2010


Ответы (7)


Это проще, чем вы думаете.

Для начала вам понадобится функция преобразования hsv или hsl в rgb. Вот код C # для этого преобразования.

Затем вы просто перебираете все возможные значения оттенка h, сохраняя постоянные saturation s и яркость l.

Если вы хотите, чтобы 100 цветов радуги были распределены равномерно:

for(double i = 0; i < 1; i+=0.01)
{
    ColorRGB c = HSL2RGB(i, 0.5, 0.5);
    //do something with the color
}

Вы также можете легко создать желаемую функцию GetRainbowColor таким образом, добавив все эти цвета в List<ColorRGB> и вернув соответствующий индексированный цвет.

person Brian R. Bondy    schedule 18.02.2010
comment
См. Также en.wikipedia.org/wiki/HLS_color_space, есть раздел о преобразовании HSL в / из RGB - person DNNX; 18.02.2010

Мне нравится использовать это:

public static Color Rainbow(float progress)
{
    float div = (Math.Abs(progress % 1) * 6);
    int ascending = (int) ((div % 1) * 255);
    int descending = 255 - ascending;

    switch ((int) div)
    {
        case 0:
            return Color.FromArgb(255, 255, ascending, 0);
        case 1:
            return Color.FromArgb(255, descending, 255, 0);
        case 2:
            return Color.FromArgb(255, 0, 255, ascending);
        case 3:
            return Color.FromArgb(255, 0, descending, 255);
        case 4:
            return Color.FromArgb(255, ascending, 0, 255);
        default: // case 5:
            return Color.FromArgb(255, 255, 0, descending);
    }
}
person Bitterblue    schedule 10.02.2014
comment
Красиво и лаконично, мне это нравится - person mafu; 23.06.2019

Вот один, который мне нравится использовать (вывод - цвет HTML RGB):

public static String Rainbow(Int32 numOfSteps, Int32 step)
        {
            var r = 0.0;
            var g = 0.0;
            var b = 0.0;
            var h = (Double)step / numOfSteps;
            var i = (Int32)(h * 6);
            var f = h * 6.0 - i;
            var q = 1 - f;

            switch (i % 6)
            {
                case 0:
                    r = 1;
                    g = f;
                    b = 0;
                    break;
                case 1:
                    r = q;
                    g = 1;
                    b = 0;
                    break;
                case 2:
                    r = 0;
                    g = 1;
                    b = f;
                    break;
                case 3:
                    r = 0;
                    g = q;
                    b = 1;
                    break;
                case 4:
                    r = f;
                    g = 0;
                    b = 1;
                    break;
                case 5:
                    r = 1;
                    g = 0;
                    b = q;
                    break;
            }
            return "#" + ((Int32)(r * 255)).ToString("X2") + ((Int32)(g * 255)).ToString("X2") + ((Int32)(b * 255)).ToString("X2");
        }
person ProfNimrod    schedule 26.08.2014

В winforms (или чем-либо еще, использующем GDI +) вы можете использовать System.Drawing.Drawing2D.LinearGradientBrush, чтобы выполнить интерполяцию за вас.

WPF System.Windows.Media.GradientBrush также может работать. Это абстрактно, поэтому вы можете получить WPF LinearGradientBrush. Он находится в другом пространстве имен, чем другой.

РЕДАКТИРОВАТЬ: поскольку вопрос был отредактирован, чтобы указать, что вы хотите быть независимыми от технологий, я не думаю, что этот ответ применим. Я собираюсь оставить его здесь на тот случай, если кто-то ищет градиенты на C #, но если кто-то сочтет это нежелательным, я удалю ответ.

Я быстро проверил, сможете ли вы получить хотя бы некоторые функции более независимым способом (например, получить массив Point или что-то в этом роде). Похоже, что это не так.

person Mike Two    schedule 18.02.2010

Начните здесь: http://www.midnightkite.com/color.html

Вы можете интерпретировать это: http://www.physics.sfasu.edu/astro/color/spectra.html это ФОРТРАН, но совершенно очевидно, что он делает.

Кроме того, вы можете прочитать более подробную информацию здесь: http://en.wikipedia.org/wiki/CIE_1931_color_space

Вот версия на Python: http://www.johnny-lin.com/py_code/wavelen2rgb.py

Кстати, первый хит Google для C # - это: http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx

person S.Lott    schedule 18.02.2010

http://colorfulconsole.com/ Позволяет в значительной степени то, что вы ищете, также может быть установлен как NuGet упаковка. Это не совсем радужный градиент. Но он может писать градиенты в консоль, также это сбивает IDE с толку

Colorful.Console

а также

System.Console

Поэтому убедитесь, что вы выбрали правильную консоль.

person Ra1n    schedule 01.10.2017

Просто используйте Rainbow.dll. Вероятно, это не лучшая библиотека, но я думаю, что для плавного эффекта радуги на каждом элементе управления WinForm, который вы хотите, это он.

Ссылка: https://marschalldev.com/2018/08/02/csharp-rainbow-effect-net-dll/

Как использовать: Yourcontrol.background = Color.FromArgb(Class1.A, Class1.R, Class1.G);

person Peter Parker    schedule 18.06.2019
comment
Срок действия ссылки истек. Пожалуйста, обновите / замените его. - person UltraStudioLTD; 25.05.2021