2010-02-18 54 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所以一定要確定正確的控制檯。