Para obtener un color en un punto específico es necesario comprender el gradiente en cuestión, y este no es el rol de la clase GradientStopCollection. El concepto de esta clase no es comprender un gradiente, sino que debe ser una simple colección de soporte para un degradado.
Es importante que comprenda el concepto de cada clase.
Para obtener un color, necesita crear una instancia de una clase que represente un degradado utilizando el degradado para pintar y, finalmente, obtener su color de la pintura.
pero le daré una solución más rápida. Puede usar un algoritmo de gradiente para generar un solo punto. Esta es una implementación de cómo hacer esto utilizando un algoritmo de gradiente lineal:
public static class GradientStopCollectionExtensions
{
public static Color GetRelativeColor(this GradientStopCollection gsc, double offset)
{
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;
}
}
Añadir esta clase en su contexto actual (contexto espacio de nombres)
Para obtener su color en cualquier lugar de insertar algo como esto:
var color = grsc.GetRelativeColor(.75);
No creo que esto se defina en WPF. Esperaría que dependa de la implementación del controlador de su tarjeta de video, el nivel de zoom, la profundidad de color de los usuarios, etc. Puede usar el método Visual.PointToScreen y luego Graphics.CopyFromScreen para tomar ese píxel. Luego use Bitmap.GetPixel para recuperar los detalles de color. – akhisp