在C#中生成WaveLength颜色梯度的算法

时间:2010-01-28 15:34:27

标签: c# color-scheme

我正在尝试生成以下颜色渐变(颜色在一端是蓝色,在另一端是红色)。

alt text http://img.brothersoft.com/screenshots/softimage/w/wavelength-160945-1.jpeg

我遵循建议put forth here。这是我的代码:

int rMax = Color.Red.R;
int rMin = Color.Blue.R;
// ... and for B, G
var colorList = new List<Color>();
for(int i=0; i<size; i++)
{
    var rAverage = rMin + (int)((rMax - rMin) * i / size);
    // ... and for B, G
    colorList.Add(Color.FromArgb(rAverage, gAverage, bAverage));
}

虽然我所做的结果显示从红色到蓝色的渐变平滑过渡,但其他中间颜色(如黄色和绿色)根本没有出现。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

您应该使用HSL颜色空间中的颜色,而不是RGB。这使您可以平滑地将色调值从0(红色)更改为1(紫色)。 System.Drawing.Color结构允许从RBG转换为HSL(GetHue等),但不允许从其他方式转换。数学是simple though

答案 1 :(得分:1)

int rMax = Color.Red.R; 
int rMin = Color.Blue.R; 
// ... and for B, G 
var colorList = new List<Color>(); 
for(int i=0; i<size; i++) 
{ 
    var rAverage = rMin + (int)((rMax - rMin) * i / size); 
    // ... and for B, G 
    colorList.Add(Color.FromArgb(rAverage, gAverage, bAverage)); 
} 

您正在设置rMin = 0rMax = 255。因此,您实际上是在设置

rAverage = 255 * i / size;

您没有列出gAveragebAverage的代码,但如果它真的相同,那么您将看到来自black-&gt; gray-&gt; white的渐进式传输,没有其他色调。

似乎你想要的是以恒定的亮度/饱和度迭代不同的色调。有关执行此操作的示例C#类,请参阅here,有关等式的说明,请参阅here