20

我想要一个基于彩虹颜色的颜色枚举(红色......黄色......绿色......蓝色......)。

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

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

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

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

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

4

8 回答 8

33

这比你想象的要容易。

首先,您需要一个 hsv 或 hsl 到 rgb 的转换功能。 这是进行该转换的 C# 代码

然后,您只需迭代色调的所有可能值,h同时保持saturations 和亮度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您还可以通过将所有这些颜色添加到 aList<ColorRGB>并返回适当的索引颜色来轻松创建所需的函数。

于 2010-02-18T12:28:30.347 回答
9

我喜欢用这个:

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);
    }
}
于 2014-02-10T11:53:54.893 回答
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");
        }
于 2014-08-26T16:00:17.460 回答
1

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

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

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

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

于 2010-02-18T12:28:28.817 回答
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

于 2010-02-18T12:27:45.907 回答
0

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

Colorful.Console

System.Console

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

于 2017-10-01T02:28:14.677 回答
0
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)

于 2021-09-23T18:08:57.650 回答
-1

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

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

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

于 2019-06-18T22:50:53.997 回答