2008-09-21 16 views
9

Der LinearGradientBrush in .net (oder sogar in GDI + als Ganzes?) Scheint einen schweren Fehler zu haben: Manchmal führt es Artefakte ein. (Siehe here oder here - im Wesentlichen wird die erste Linie eines linearen Farbverlaufs in der Endfarbe gezeichnet, dh ein Farbverlauf von Weiß zu Schwarz beginnt mit einer schwarzen Linie und dann mit dem richtigen Weiß zu Schwarz Farbverlauf)LinearGradientBrush Artefakt Problemumgehung?

Ich frage mich wenn jemand einen funktionierenden Workaround dafür gefunden hat? Dies ist ein wirklich ärgerlicher Fehler :-(

Hier ist ein Bild der Artefakte, beachten Sie, dass es 2 LinearGradientBrushes.

alt text http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg

+0

Awesome, kommt SO nun zuerst für die meisten meiner wtf sucht :) –

+0

, meine Haare für eine gute Stunde über das Herausziehen – Antony

Antwort

9

ich dies auch bemerkt haben, wenn Gradienten Bürsten Der einzige Englisch: www.mplayerhq.hu/DOCS/HTML/en/menc-...d-mpeg4.html Effektive Problemumgehung, die ich habe, ist, das Gradient - Pinselrechteck immer um 1 Pixel größer an allen Rändern als dem Bereich zu erstellen, der damit bemalt werden soll, was dich vor dem Problem an allen vier Kanten schützt Kanten sind ein Bruchteil von denen, die Sie angeben, aber das ist besser als das Zeichenartefaktproblem!

+0

Für meine Zwecke, das funktioniert, und jetzt sind die Artefakte schließlich \ o/ –

5

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

+0

gegangen Ich habe kenne diese Funktion nicht einmal. ordentlich :) –

1

Zumindest mit WPF könnten Sie versuchen, GradientStop s zu verwenden, um 100% richtige Farben direkt an den Rändern zu erhalten, auch wenn Sie übermalen.

2

Ich würde Phil Antwort oben verfeinern (das ist wirklich ein Kommentar, aber ich habe dieses Privileg nicht). Das Verhalten ich sehe, ist im Gegensatz zu the documentation, die sagt:

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

In einigen Fällen erhalten Sie einen einzelnen Pixelumbruch. Soweit ich das beurteilen kann (experimentell), bekomme ich das Problem nur, wenn die Breite oder Höhe des Rechtecks ​​ungerade ist. Um den Fehler zu umgehen, finde ich es angemessen, das Rechteck LinearGradientBrush genau dann um 1 Pixel zu erhöhen, 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.

So ein Rechteck zu füllen r ich 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); 

Insane aber wahr.

Verwandte Themen