在渐变上获取特定位置的颜色

我有GradientStopCollection:

GradientStopCollection grsc = new GradientStopCollection(3); grsc.Add(new GradientStop(Colors.Red, 0)); grsc.Add(new GradientStop(Colors.Yellow, .5)); grsc.Add(new GradientStop(Colors.Green, 1)); 

我可以在特定位置获得颜色吗? 例如:位置0:红色位置.5:黄色位置.75:??

有第三方课可以这样做吗?

要获得特定点的颜色,有必要了解所讨论的渐变,这不是GradientStopCollection类的作用。 这个类的概念不是理解渐变,而应该是对渐变的简单支持集合。

重要的是要了解每个class级的概念。

要获得颜色,您需要使用渐变来实例化一个表示渐变的类,并最终从绘画中获取颜色。

但我会给你一个更快的解决方案。 您可以使用渐变算法生成单个点。 这是使用线性渐变算法如何执行此操作的实现:

 public static class GradientStopCollectionExtensions { public static Color GetRelativeColor(this GradientStopCollection gsc, double offset) { var point = gsc.SingleOrDefault(f => f.Offset == offset); if (point != null) return point.Color; GradientStop before = gsc.Where(w => w.Offset == gsc.Min(m => m.Offset)).First(); GradientStop after = gsc.Where(w => w.Offset == gsc.Max(m => m.Offset)).First(); foreach (var gs in gsc) { if (gs.Offset < offset && gs.Offset > before.Offset) { before = gs; } if (gs.Offset > offset && gs.Offset < after.Offset) { after = gs; } } var color = new Color(); color.ScA = (float)((offset - before.Offset) * (after.Color.ScA - before.Color.ScA) / (after.Offset - before.Offset) + before.Color.ScA); color.ScR = (float)((offset - before.Offset) * (after.Color.ScR - before.Color.ScR) / (after.Offset - before.Offset) + before.Color.ScR); color.ScG = (float)((offset - before.Offset) * (after.Color.ScG - before.Color.ScG) / (after.Offset - before.Offset) + before.Color.ScG); color.ScB = (float)((offset - before.Offset) * (after.Color.ScB - before.Color.ScB) / (after.Offset - before.Offset) + before.Color.ScB); return color; } } 

PS:该算法假设没有具有相同偏移的停止。 如果有多个具有相同偏移量的停靠点,则将抛出InvalidOperationException

在当前上下文中添加此类(名称空间上下文)

要在任何地方获取颜色,请插入以下内容:

 var color = grsc.GetRelativeColor(.75); 

我尝试过Jonny Piazzi写的方法。 但它无法正常工作。
所以我在下面写下自己的一个:

 private static Color GetColorByOffset(GradientStopCollection collection, double offset) { GradientStop[] stops = collection.OrderBy(x => x.Offset).ToArray(); if (offset <= 0) return stops[0].Color; if (offset >= 1) return stops[stops.Length - 1].Color; GradientStop left = stops[0], right = null; foreach (GradientStop stop in stops) { if (stop.Offset >= offset) { right = stop; break; } left = stop; } Debug.Assert(right != null); offset = Math.Round((offset - left.Offset)/(right.Offset - left.Offset), 2); byte a = (byte) ((right.Color.A - left.Color.A)*offset + left.Color.A); byte r = (byte) ((right.Color.R - left.Color.R)*offset + left.Color.R); byte g = (byte) ((right.Color.G - left.Color.G)*offset + left.Color.G); byte b = (byte) ((right.Color.B - left.Color.B)*offset + left.Color.B); return Color.FromArgb(a, r, g, b); } 

我希望这个对你有用!

我在下面的xaml代码中使用了这个方法,将指定的数字显示为热图位置。

       
  foreach (var gs in gsc) { if (gs.Offset == offset) return gs.Color; //new line added if (gs.Offset < offset && gs.Offset > before.Offset) { before = gs; } if (gs.Offset > offset && gs.Offset < after.Offset) { after = gs; } }