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

ID : 274482

viewed : 48

Tags : c#colorsgradientc#





Top 5 Answer for How do I get a rainbow color gradient in C#?

vote vote

96

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.

vote vote

90

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

70

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

60

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.

vote vote

51

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

Top 3 video Explaining How do I get a rainbow color gradient in C#?







Related QUESTION?