如何在C#中获得彩虹色渐变?

时间:2010-02-18 12:20:25

标签: c# colors gradient

我希望根据彩虹颜色(红色......黄色......绿色......蓝色......)列出颜色。

我基本上看到两种方法:

  1. 创建一个包含一些重要参考颜色的查找表,并在这些颜色之间进行插值。我根本不喜欢这个想法。

  2. 应用一些或多或少花哨的数学。可能更少,但我不太清楚它是如何工作的。有什么想法吗?

  3. (哦,当我做了一些SO研究时,我发现没有好结果。如果这个问题已经发布,请指出我的位置,我会删除它。)

    编辑:我更喜欢这个独立于使用的技术来显示渐变。例如,GetRainbowColor(float f)之类的f(范围从0(红色)到1(紫色))会很有效。

7 个答案:

答案 0 :(得分:31)

这比你想象的要容易。

首先你需要一个hsv或hsl到rgb的转换函数。 Here is C# code to do that conversion

然后,您只需迭代色调h的所有可能值,同时保持saturation和光度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>

答案 1 :(得分:6)

我喜欢用这个:

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

答案 2 :(得分:1)

在winforms(或使用GDI +的任何内容)中,您可以使用System.Drawing.Drawing2D.LinearGradientBrush为您进行插值。

WPF的System.Windows.Media.GradientBrush也可以正常工作。它是抽象的,所以你最终可能会得到WPF的LinearGradientBrush。它与另一个名称空间不同。

编辑:由于编辑的问题是为了表明您希望独立于技术,我不认为这个答案适用。我现在要把它留在这里以防万一有人在C#中寻找Gradients,但是如果有人发现那令人反感,我会删除答案。

我做了一个快速检查,看看你是否能够以更独立的方式获得某些功能(例如获取Point数组或其他东西)。似乎并非如此。

答案 3 :(得分:1)

这是我喜欢使用的(输出是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");
        }

答案 4 :(得分:0)

从这里开始:http://www.midnightkite.com/color.html

你可以解释一下:http://www.physics.sfasu.edu/astro/color/spectra.html它是FORTRAN,但它的作用非常明显。

此外,您可以在此深入阅读:http://en.wikipedia.org/wiki/CIE_1931_color_space

这是Python中的一个版本:http://www.johnny-lin.com/py_code/wavelen2rgb.py

顺便说一句,C#的第一个谷歌热门话题是:http://miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx

答案 5 :(得分:0)

http://colorfulconsole.com/ 允许你正在寻找的东西,也可以作为NuGet包安装。 它不完全是彩虹渐变。 但它可以将渐变写入控制台,这也会使IDE在

之间混淆
Colorful.Console

System.Console

因此,请务必定义正确的控制台。

答案 6 :(得分:0)

只需使用Rainbow.dll。这可能不是最好的库,但是对于我想要的每个WinForm控件来说,要获得平滑的Rainbow效果,就是这样。

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

使用方法: Yourcontrol.background = Color.FromArgb(Class1.A, Class1.R, Class1.G);