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

Posted

技术标签:

【中文标题】如何在 C# 中获得彩虹色渐变?【英文标题】:How do I get a rainbow color gradient in C#? 【发布时间】:2011-01-18 07:29:08 【问题描述】:

我想根据彩虹的颜色(红色...黄色...绿色...蓝色...)枚举颜色。

我基本上看到了两种方法:

    创建一个包含一些重要参考颜色的查找表,并在这些颜色之间进行插值。我一点也不喜欢这个主意。

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

(哦,虽然我做了一些 SO 研究,但没有找到好的结果。如果这个问题已经发布了,请指点我的位置,我会删除它。)

编辑:我更希望它独立于使用的技术来显示渐变。例如,像 GetRainbowColor (float f) 这样 f 范围从 0(红色)到 1(紫色)的东西会很好用。

【问题讨论】:

WPF?表格? ASP.NET?答案可能会因技术而异。 【参考方案1】:

这比你想象的要容易。

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

然后您只需迭代色调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

您还可以通过将所有这些颜色添加到List&lt;ColorRGB&gt; 并返回适当的索引颜色来轻松创建所需的函数GetRainbowColor

【讨论】:

另见en.wikipedia.org/wiki/HLS_color_space,有一节关于将HSL转换为RGB【参考方案2】:

我喜欢用这个:

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

【讨论】:

漂亮简洁,我喜欢【参考方案3】:

这是我喜欢使用的一种(输出是 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】:

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

WPF 的 System.Windows.Media.GradientBrush 也可以工作。它是抽象的,因此您最终可能会使用 WPF 的 LinearGradientBrush。它与另一个位于不同的命名空间中。

编辑:由于对问题进行了编辑以表明您希望独立于技术,因此我认为此答案不适用。我暂时将其留在这里,以防有人在 C# 中寻找渐变,但如果有人觉得这令人反感,我将删除答案。

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

【讨论】:

【参考方案5】:

从这里开始: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

【讨论】:

【参考方案6】:

http://colorfulconsole.com/ 几乎可以满足您的需求,也可以作为 NuGet 包安装。 它不完全是彩虹渐变。 但它可以将渐变写入控制台,这也会混淆

之间的 IDE
Colorful.Console

System.Console

所以一定要定义正确的控制台。

【讨论】:

【参考方案7】:
uint32_t Wheel(byte WheelPos)  // 0 - 255 return unit32_t
  if(WheelPos < 85) 
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); //red + green
   else if(WheelPos < 170) 
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); //blue + red
   else 
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); //green + blue
  

如果 wheelpos == 5,则返回 (15, 240, 0)

6 = (18, 237, 0)

【讨论】:

请添加更多详细信息。【参考方案8】:

只需使用Rainbow.dll。这可能不是最好的库,但我认为,为了在你想要的每个 WinForm 控件上实现平滑的彩虹效果,就是这样。

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

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

【讨论】:

链接死了,没有那个答案就没用了。

以上是关于如何在 C# 中获得彩虹色渐变?的主要内容,如果未能解决你的问题,请参考以下文章

PS如何画环形渐变

怎么用条件格式将一个区域设置为渐变填充蓝色(标准色)数据条?

C# 简单的方法统一设置控件在焦点获得时,背景色改变,焦点离开时背景色恢复默认

html 彩虹渐变动画

json 混合彩虹渐变

如何使用网页渐变色来提升设计逼格