Per ottenere un colore in un punto specifico è necessario comprendere la sfumatura in questione e questo non è il ruolo della classe GradientStopCollection. Il concetto di questa classe non è capire un gradiente, ma dovrebbe essere una semplice raccolta di supporto a un gradiente.
È importante comprendere il concetto di ogni classe.
Per ottenere un colore, è necessario creare un'istanza di una classe che rappresenta un gradiente utilizzando il gradiente per dipingere e ottenere infine il colore dal dipinto.
ma ti darò una soluzione più rapida. È possibile utilizzare un algoritmo di sfumatura per generare un singolo punto. Si tratta di un'implementazione di come fare questo utilizzando un algoritmo gradiente lineare:
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;
}
}
Aggiungi questa classe nel contesto attuale (contesto namespace)
Per ottenere il colore in qualsiasi luogo si inserisce qualcosa di simile a questo:
var color = grsc.GetRelativeColor(.75);
fonte
2012-03-10 23:21:35
Non penso che questo sia definito da nessuna parte in WPF. Mi aspetto che dipenda dall'implementazione del driver della scheda video, dal livello di zoom, dalla profondità del colore degli utenti, ecc. È possibile utilizzare il metodo Visual.PointToScreen e poi Graphics.CopyFromScreen per catturare quel pixel. Quindi utilizzare Bitmap.GetPixel per recuperare i dettagli del colore. – akhisp