Frage

Der LinearGradientBrush in .net (oder sogar in GDI+ insgesamt?) scheint einen schwerwiegenden Fehler zu haben:Manchmal werden Artefakte eingeführt.(Sehen Hier oder Hier - Im Wesentlichen wird die erste Linie eines linearen Farbverlaufs in der Endfarbe gezeichnet, d. h.ein Farbverlauf von Weiß nach Schwarz beginnt mit einer schwarzen Linie und dann mit dem richtigen Weiß-zu-Schwarz-Farbverlauf.

Ich frage mich, ob jemand eine funktionierende Problemumgehung dafür gefunden hat?Das ist ein wirklich nerviger Bug :-(

Hier ist ein Bild der Artefakte. Beachten Sie, dass es zwei LinearGradientBrushes gibt:

Alternativtext http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg

War es hilfreich?

Lösung

Ich habe dies auch bemerkt, wenn Gradienten Bürsten. Die einzig wirksame Abhilfe, die ich habe, ist, immer das Farbverlauf Rechteck 1 Pixel erstellen größer an allen Kanten als die Fläche, die mit ihm zu lackierenden werden. Das schützt Sie vor der Ausgabe an allen vier Kanten. Der Nachteil ist, dass die Farben an den Rändern sind ein Bruchteil aus denen Sie angeben, verwendet, aber das ist besser als die Zeichnung Artefakt Problem!

Andere Tipps

Sie können die schöne Inflate verwenden (int i) Methode auf einem Rechteck, um die größere Version zu erhalten.

Ich würde Phils Antwort oben verfeinern (das ist eigentlich ein Kommentar, aber ich habe dieses Privileg nicht).Das Verhalten, das ich sehe, ist widersprüchlich die Dokumentation, was sagt:

Die Startlinie steht senkrecht zur Orientierungslinie und verläuft durch eine der Ecken des Rechtecks.Alle Punkte auf der Startlinie haben die Startfarbe.Dann ist die Endlinie senkrecht zur Orientierungslinie und verläuft durch eine der Ecken des Rechtecks.Alle Punkte auf der Endlinie haben die Endfarbe.

In einigen Fällen erhalten Sie nämlich einen einzelnen Pixel-Wrap-Around.Soweit ich das beurteilen kann (durch Experimente), tritt das Problem nur auf, wenn die Breite oder Höhe des Rechtecks ​​ungerade ist.Um den Fehler zu umgehen, halte ich es für ausreichend, das LinearGradientBrush-Rechteck genau dann um 1 Pixel zu vergrößern, wenn die Dimension (vor der Erweiterung) eine ungerade Zahl ist.Mit anderen Worten: Runden Sie das Pinselrechteck immer um die nächste gerade Anzahl von Pixeln in Breite und Höhe auf.

Also um ein Rechteck zu füllen r Ich verwende so etwas wie:

Rectangle gradientRect = r;
if (r.Width % 2 == 1)
{
    gradientRect.Width += 1;
}
if (r.Height % 2 == 1)
{
    gradientRect.Height += 1;
}
var lgb = new LinearGradientBrush(gradientRect, startCol, endCol, angle);
graphics.FillRectangle(lgb, r);

Wahnsinn, aber wahr.

Mindestens mit WPF Sie könnten versuchen, GradientStops zu verwenden 100% richtige Farben an den Rand rechts zu bekommen, auch wenn Übermalung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top