簡體   English   中英

如何在C#中獲得彩虹色漸變?

[英]How do I get a rainbow color gradient in C#?

我想根據彩虹顏色(紅色......黃色......綠色......藍色......)列出顏色。

我基本上看到兩種方法:

  1. 創建一個包含一些重要參考顏色的查找表,並在它們之間進行插值。 我完全不喜歡這個想法。

  2. 應用一些或多或少花哨的數學。 可能更少,但我不太清楚它是如何工作的。 有任何想法嗎?

(哦,當我做了一些SO研究時,我發現沒有好的結果。如果這個問題已經發布,請指出我的位置,我會刪除它。)

編輯:我更喜歡這個獨立於使用的技術來顯示漸變。 例如,GetRainbowColor(float f)之類的f(范圍從0(紅色)到1(紫色))會很有效。

這比你想象的要容易。

首先,您需要hsv或hsl到rgb轉換功能。 這是進行轉換的C#代碼

然后,您只需迭代色調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這種方式創建所需的函數GetRainbowColor

我想用這個:

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

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

WPF的System.Windows.Media.GradientBrush也可以正常工作。 它是抽象的,所以你最終可能會得到WPF的LinearGradientBrush。 它與另一個名稱空間不同。

編輯:因為編輯的問題表明你想要獨立於科技我不認為這個答案適用。 我現在要把它留在這里以防萬一有人在C#中尋找Gradients,但如果有人發現那令人反感,我會刪除答案。

我做了一個快速檢查,看看你是否能夠以更獨立的方式獲得某些功能(例如獲取Point數組或其他東西)。 似乎並非如此。

這是我喜歡使用的(輸出是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");
        }

從這里開始: 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

BTW,C#的第一個谷歌熱門是: http//miguelmoreno.net/sandbox/wavelengthtoRGB/default.aspx

http://colorfulconsole.com/允許你正在尋找的東西,也可以作為NuGet包安裝。 它不完全是彩虹漸變。 但它可以將漸變寫入控制台,這也會使IDE混淆

Colorful.Console

System.Console

因此,請確保定義正確的控制台。

只需使用Rainbow.dll 這可能不是最好的庫,但是對於平滑的Rainbow效果,我想,你想要的每個WinForm控件,就是這樣。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM