2010-02-18 55 views
19

我想要基于彩虹颜色(红色......黄色......绿色......蓝色......)来枚举颜色。如何在C#中获得彩虹颜色渐变?

我看基本上有两种方式来做到这一点:

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

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

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

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

+1

WPF?的WinForms? ASP.NET?答案可能会根据技术而变化。 – 2010-02-18 12:26:08

回答

30

这比您想象的要容易。

首先你需要一个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 
} 

你也很容易将所有这些颜色的List<ColorRGB>并返回相应的索引颜色创建你需要的功能GetRainbowColor这种方式。

+5

另请参阅http://en.wikipedia.org/wiki/HLS_color_space,有关于将HSL转换为RGB的部分 – DNNX 2010-02-18 12:31:12

1

在的WinForms(或者任何使用GDI +的东西),你可以使用System.Drawing.Drawing2D.LinearGradientBrush为你做插值。

WPF的System.Windows.Media.GradientBrush也可以工作。这是抽象的,所以你最终可能会得到WPF的LinearGradientBrush。它在另一个命名空间中。

编辑:由于问题被编辑,以表明你想成为科技独立我不认为这个答案适用。现在我要把它留在这里,以防有人在C#中寻找渐变,但如果有人发现令人反感的话,我会删除答案。

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

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

http://colorfulconsole.com/ 允许几乎你在找什么因为,也可以作为NuGet软件包进行安装。 这不完全是彩虹渐变。 但它可以写入渐变到控制台,这也混淆了

Colorful.Console 

System.Console 

之间的IDE所以一定要确定正确的控制台。