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

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

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

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

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

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

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

【问题讨论】:

  • WPF?表格? ASP.NET?答案可能会因技术而异。

标签: c# colors gradient


【解决方案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

【讨论】:

【解决方案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);

        【讨论】:

        • 链接死了,没有那个答案就没用了。
        猜你喜欢
        • 2021-06-12
        • 1970-01-01
        • 2016-09-14
        • 2015-11-10
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 2017-10-05
        相关资源
        最近更新 更多