Чтобы получить цвет в определенной точке, необходимо понимать рассматриваемый градиент, а это не роль класса 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;
}
}
PS: Этот алгоритм предполагает, что нет остановок с одинаковым смещением. Если есть несколько остановок с одним и тем же смещением, выдается InvalidOperationException
.
Добавить этот класс в текущий контекст (контекст пространства имен)
Чтобы получить свой цвет в любом месте, вставьте что-то вроде этого:
var color = grsc.GetRelativeColor(.75);