如何在 C# 中获得彩虹色渐变?
Posted
技术标签:
【中文标题】如何在 C# 中获得彩虹色渐变?【英文标题】:How do I get a rainbow color gradient in C#? 【发布时间】:2011-01-18 07:29:08 【问题描述】:我想根据彩虹的颜色(红色...黄色...绿色...蓝色...)枚举颜色。
我基本上看到了两种方法:
创建一个包含一些重要参考颜色的查找表,并在这些颜色之间进行插值。我一点也不喜欢这个主意。
应用一些或多或少花哨的数学。可能更少,但我不太明白它是如何工作的。有什么想法吗?
(哦,虽然我做了一些 SO 研究,但没有找到好的结果。如果这个问题已经发布了,请指点我的位置,我会删除它。)
编辑:我更希望它独立于使用的技术来显示渐变。例如,像 GetRainbowColor (float f) 这样 f 范围从 0(红色)到 1(紫色)的东西会很好用。
【问题讨论】:
WPF?表格? ASP.NET?答案可能会因技术而异。 【参考方案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<ColorRGB>
并返回适当的索引颜色来轻松创建所需的函数GetRainbowColor
。
【讨论】:
另见en.wikipedia.org/wiki/HLS_color_space,有一节关于将HSL转换为RGB【参考方案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 包安装。 它不完全是彩虹渐变。 但它可以将渐变写入控制台,这也会混淆
之间的 IDEColorful.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);
【讨论】:
链接死了,没有那个答案就没用了。以上是关于如何在 C# 中获得彩虹色渐变?的主要内容,如果未能解决你的问题,请参考以下文章
怎么用条件格式将一个区域设置为渐变填充蓝色(标准色)数据条?