Uzyskanie koloru w określonym punkcie jest niezbędne do zrozumienia danego gradientu, a nie jest to rola klasy GradientStopCollection. Pojęcie tej klasy nie polega na zrozumieniu gradientu, ale powinno być prostym zbiorem wsparcia dla gradientu.
Ważne jest, aby zrozumieć pojęcie każdej klasy.
Aby uzyskać kolor, należy utworzyć instancję klasy reprezentującej gradient za pomocą gradientu do malowania iw końcu uzyskać ich kolor z obrazu.
, ale dam ci szybsze rozwiązanie. Możesz użyć algorytmu gradientowego do wygenerowania pojedynczego punktu. Jest to realizacja, jak to zrobić stosując liniowy algorytm gradient:
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;
}
}
Dodaj tę klasę w bieżącym kontekście (kontekstowe przestrzeni nazw)
Aby uzyskać kolor w dowolnym miejscu możesz wstawić coś takiego:
var color = grsc.GetRelativeColor(.75);
Nie sądzę, że jest to zdefiniowane w dowolnym miejscu w WPF. Spodziewam się, że zależy to od implementacji sterownika karty wideo, poziomu powiększenia, głębi kolorów użytkownika itd. Możesz użyć metody Visual.PointToScreen, a następnie Graphics.CopyFromScreen, aby pobrać ten piksel. Następnie użyj Bitmap.GetPixel, aby pobrać szczegóły kolorów. – akhisp