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

Mat*_*har 13 .net c# xaml lineargradientbrush

我有以下内容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));
Run Code Online (Sandbox Code Playgroud)

我可以在特定的"位置"获得颜色吗?例如:

  • 位置0:红色
  • 位置.5:黄色
  • 位置.75: Yellow<~>Green

WPF/某些第三方库中是否有API 可以做到这一点?

Jon*_*zzi 18

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

重要的是要了解每个班级的概念.

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

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

var color = grsc.GetRelativeColor(.75);
Run Code Online (Sandbox Code Playgroud)