简体   繁体   中英

How do I get a rainbow color gradient in C#?

I'd like to have an enumeration of Colors based on the rainbow colors (red... yellow... green... blue...).

I see basically two ways to do that:

  1. Create a lookup table containing some important reference colors and interpolate between these. I don't like this idea at all.

  2. Apply some more or less fancy math. Probably less, but I don't quite see how it works. Any ideas?

(Oh, and while I did some SO research, I found no good results. If this question was already posted, please just point me to the location and I'll delete this.)

I'd prefer to have this independent of the used technology to display the gradient. 我更喜欢这个独立于使用的技术来显示渐变。 For instance, something like GetRainbowColor (float f) with f ranging from 0 (red) to 1 (violet) would work great.

This is easier than you think.

First you need an hsv or hsl to rgb conversion function. Here is C# code to do that conversion .

Then you simply iterate over all of the possible values of the hue h while keeping the saturation s and luminosity l constant.

If you want 100 colors of the rainbow spaced out equally:

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

You could also easily create your desired function GetRainbowColor this way by adding all of these colors to a List<ColorRGB> and returning the appropriate indexed color.

I like to use this:

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);
    }
}

In winforms(or anything using GDI+) you could use System.Drawing.Drawing2D.LinearGradientBrush to do the interpolation for you.

WPF's System.Windows.Media.GradientBrush could work as well. It's abstract so you might end up with WPF's LinearGradientBrush. It's in a different namespace than the other.

EDIT: since the question was edited to indicate that you want to be tech independent I don't think this answer applies. I'm going to leave it here for now in case someone is looking for Gradients in C#, but if someone finds that objectionable I'll remove the answer.

I did a quick check to see if you could at least get at some of the functionality in a more independent way (such as getting an array of Point or something). Doesn't appear to be the case.

Here's one I like to use (the output is an HTML RGB color):

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");
        }

Start here: http://www.midnightkite.com/color.html

You can interpret this: http://www.physics.sfasu.edu/astro/color/spectra.html it's FORTRAN, but it's pretty obvious what it does.

Also, you can read more in-depth here: http://en.wikipedia.org/wiki/CIE_1931_color_space

Here's a version in Python: http://www.johnny-lin.com/py_code/wavelen2rgb.py

BTW, the first google hit for C# is this: http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx

http://colorfulconsole.com/ Allows pretty much what you're looking for, also can be installed as a NuGet package. It's not exactly a rainbow gradient. But it can write gradients to the console, also this confuses the IDE between the

Colorful.Console

and

System.Console

So make sure to define the right Console.

Just use the Rainbow.dll . This is probably not the best library, but for a smooth Rainbow effect on, I think, every WinForm Control you want, this is it.

Link: https://marschalldev.com/2018/08/02/csharp-rainbow-effect-net-dll/

How to use: Yourcontrol.background = Color.FromArgb(Class1.A, Class1.R, Class1.G);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM