我正在尝试生成以下颜色渐变(颜色在一端是蓝色,在另一端是红色)。
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));
}
虽然我所做的结果显示从红色到蓝色的渐变平滑过渡,但其他中间颜色(如黄色和绿色)根本没有出现。
我做错了什么?
答案 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 = 0
和rMax = 255
。因此,您实际上是在设置
rAverage = 255 * i / size;
您没有列出gAverage
和bAverage
的代码,但如果它真的相同,那么您将看到来自black-&gt; gray-&gt; white的渐进式传输,没有其他色调。
似乎你想要的是以恒定的亮度/饱和度迭代不同的色调。有关执行此操作的示例C#类,请参阅here,有关等式的说明,请参阅here。