在C#中生成颜色渐变

我的问题类似于这里的问题 ,除了我正在使用C#。

我有两种颜色,我有一个预定义的步骤。 如何检索两者之间渐变的Color列表?

这是我尝试过的一种方法,它不起作用:

 int argbMax = Color.Chocolate.ToArgb(); int argbMin = Color.Blue.ToArgb(); var colorList = new List(); for(int i=0; i<size; i++) { var colorAverage= argbMin + (int)((argbMax - argbMin) *i/size); colorList.Add(Color.FromArgb(colorAverage)); } 

如果你尝试上面的代码,你会发现argb的逐渐增加并不对应于颜色的视觉逐渐增加。

对此有何想法?

您必须提取R,G,B分量并分别对它们中的每一个执行相同的线性插值,然后重新组合。

 int rMax = Color.Chocolate.R; int rMin = Color.Blue.R; // ... and for B, G var colorList = new List(); for(int i=0; i 

也许这个function可以帮助:

 public IEnumerable GetGradients(Color start, Color end, int steps) { Color stepper = Color.FromArgb((byte)((end.A - start.A) / (steps - 1)), (byte)((end.R - start.R) / (steps - 1)), (byte)((end.G - start.G) / (steps - 1)), (byte)((end.B - start.B) / (steps - 1))); for (int i = 0; i < steps; i++) { yield return Color.FromArgb(start.A + (stepper.A * i), start.R + (stepper.R * i), start.G + (stepper.G * i), start.B + (stepper.B * i)); } } 

奥利弗的答案非常接近……但在我的情况下,我的一些步进数字必须是负数。 当将步进器值转换为Color结构时,我的值从负值变为更高的值,例如-1变为类似于254的值。我单独设置我的步长值以解决此问题。

 public static IEnumerable GetGradients(Color start, Color end, int steps) { int stepA = ((end.A - start.A) / (steps - 1)); int stepR = ((end.R - start.R) / (steps - 1)); int stepG = ((end.G - start.G) / (steps - 1)); int stepB = ((end.B - start.B) / (steps - 1)); for (int i = 0; i < steps; i++) { yield return Color.FromArgb(start.A + (stepA * i), start.R + (stepR * i), start.G + (stepG * i), start.B + (stepB * i)); } } 
  public static List GetGradientColors(Color start, Color end, int steps) { return GetGradientColors(start, end, steps, 0, steps - 1); } public static List GetGradientColors(Color start, Color end, int steps, int firstStep, int lastStep) { var colorList = new List(); if (steps <= 0 || firstStep < 0 || lastStep > steps - 1) return colorList; double aStep = (end.A - start.A) / steps; double rStep = (end.R - start.R) / steps; double gStep = (end.G - start.G) / steps; double bStep = (end.B - start.B) / steps; for (int i = firstStep; i < lastStep; i++) { var a = start.A + (int)(aStep * i); var r = start.R + (int)(rStep * i); var g = start.G + (int)(gStep * i); var b = start.B + (int)(bStep * i); colorList.Add(Color.FromArgb(a, r, g, b)); } return colorList; } 

使用double而不是int:

 double stepA = ((end.A - start.A) / (double)(steps - 1)); double stepR = ((end.R - start.R) / (double)(steps - 1)); double stepG = ((end.G - start.G) / (double)(steps - 1)); double stepB = ((end.B - start.B) / (double)(steps - 1)); 

和:

 yield return Color.FromArgb((int)start.A + (int)(stepA * step), (int)start.R + (int)(stepR * step), (int)start.G + (int)(stepG * step), (int)start.B + (int)(stepB * step));