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

后端 未结 7 2136
太阳男子
太阳男子 2020-12-03 05:18

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. Cre

相关标签:
7条回答
  • 2020-12-03 05:37

    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);
        }
    }
    
    0 讨论(0)
  • 2020-12-03 05:39

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

    0 讨论(0)
  • 2020-12-03 05:40

    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");
            }
    
    0 讨论(0)
  • 2020-12-03 05:44

    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.

    0 讨论(0)
  • 2020-12-03 05:49

    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

    0 讨论(0)
  • 2020-12-03 05:55

    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.

    0 讨论(0)
提交回复
热议问题