GDI+ - Bugs die einem den letzen Nerv töten können

10/02/2010 - 14:56 von Karsten Sosna | Report spam
Hallo NG,
für mich ist das völlig unverstàndlich deswegen deklariere ich es als Bug.

Ich erstelle eine Bitmap(100x100) und das demensprechende Graphics-Objekt:

Using BM As New Bitmap(100, 100)
Using G = Graphics.FromImage(BM)

Nun lösche ich den Hintergrund

G.Clear(Color.White)

Bis hierhin nichts verbotenes(wird auch weiterhin geschehen). Als nàchstes
verschiebe ich meine Koordinaten Ursprung in die linke untere Ecke

G.TranslateTransform(0, 99)

Immer noch O.K. . Nun drehe ich mein Koordinatensystem um 90° entgegesetzt
zum Uhrzeigersinn.

G.RotateTransform(-90)

Auch O.K. . Mein Koordinatenursprung liegt jetzt in der linken unteren Ecke
der Bitmap und mein Koordinatensystem ist wie gefordert gedreht. Zur Prüfung
zeichne ich eine Linie:

G.DrawLine(Pens.Red, 0, 0, 0, 19)

Passt genau, die Linie muss in der unteren linken Ecke beginnen und im Punkt
{19; 0} enden, Immerhin ist das Koordinatensystem verschoben und gedreht
worden.

Doch jetzt kommt es:

G.FillRectangle(Brushes.Green, New Rectangle(0, 0, 80, 40))

Genau, jetzt sollte die rote Linie verdeckt sein.

End Using
e.Graphics.DrawImage(BM, 200, 200)
End Using

Tut sie aber nicht!!! Das Rectangle beginnt im falschen Ursprung, hat aber
die richtige Größe. Einfach mal ausprobieren.

Aus dieser Anfangsidee entstand alles:

Using BM As New Bitmap(100, 100)
Using G = Graphics.FromImage(BM)
G.Clear(Color.White)
G.FillRectangle(Brushes.Green, New Rectangle(0, 0, 80, 40))
G.DrawLine(Pens.Red, 0, 0, 0, 19)
End Using
e.Graphics.DrawImage(BM, 200, 200)
End Using

Siehe da die Linie ist liegt am Anfang des grünen Rechtecks. Jetzt der
gleiche Codeabschnitt mit Transformation:

Using BM As New Bitmap(100, 100)
Using G = Graphics.FromImage(BM)
G.Clear(Color.White)
G.TranslateTransform(0, 99) 'Lediglich diese
G.RotateTransform(-90) 'und diese Zeile wurden eingefügt
G.FillRectangle(Brushes.Green, New Rectangle(0, 0, 80, 40))
G.DrawLine(Pens.Red, 0, 0, 0, 19)
End Using
e.Graphics.DrawImage(BM, 200, 200)
End Using

Selbst wenn meine Transformationen falsch wàren(was sie nicht sind) würde
ich nie zu dem gleichen Ergebnis kommen. Eine Krise ohne Gleichen umhüllt
mich hier. Dabei wollte ich nur der undurchsichtigen Ausrichtung eines
LinearGradientBrush entgehen(das ist aber ein anderes Thema, was hier nur
verwirren würde).

Ach und jetzt kommt nicht damit, das auf die Reichenfolge der
Transformationen ankommt, das ist mir bewusst:

Using BM As New Bitmap(100, 100)
Using G = Graphics.FromImage(BM)
G.Clear(Color.White)
G.RotateTransform(-90)
G.TranslateTransform(-99, 0)
G.DrawLine(Pens.Red, 0, 0, 0, 19)
G.FillRectangle(Brushes.Green, New Rectangle(0, 0, 80, 40))
End Using
e.Graphics.DrawImage(BM, 200, 200)
End Using

Bringt auch kein anderes Ergebnis!

Bin ja mal gespannt, ob dafür jemand eine Antwort hat.
Gruß Scotty
 

Lesen sie die antworten

#1 Thorsten Gudera
14/02/2010 - 02:48 | Warnen spam
Hallo Karsten,

"Karsten Sosna" <kDOTsosna_no_AT_spam_x.reflexDOTde> schrieb im Newsbeitrag
news:
Genau, jetzt sollte die rote Linie verdeckt sein.


...
Tut sie aber nicht!!! Das Rectangle beginnt im falschen Ursprung, hat aber
die richtige Größe. Einfach mal ausprobieren.


[...]
Gruß Scotty



naja, Du hast sicherlich mittlerweile bemerkt, dass
Graphics.Fill-"irgendwas" den Bereich *innerhalb* der angegebenen Struktur
zeichnet.
Das heißt: FillRectangle(Brushes.Green, New Rectangle(0, 0, 40, 40)) malt
Dir ein Rechteck von 1,1 nach einschließlich 38, 38. Wenn Du's ganz haben
möchtest, dann solltest Du es nach dem Füllen noch Mal zeichnen:

Using BM As New Bitmap(100, 100)
Using G = Graphics.FromImage(BM)
G.Clear(Color.White)
G.TranslateTransform(0, 99) 'Lediglich diese
G.RotateTransform(-90) 'und diese Zeile wurden eingefügt
G.InterpolationMode =
Drawing2D.InterpolationMode.NearestNeighbor

G.DrawLine(Pens.Red, 0, 0, 0, 19)

G.FillRectangle(Brushes.Green, New Rectangle(0, 0, 40, 40))
'ein, oder auskommentieren, um Effekt zu zeigen
G.DrawRectangle(Pens.Green, New Rectangle(0, 0, 40, 40))
End Using
e.Graphics.DrawImage(BM, 0, 0)
End Using

Schönes Restwochenende,

Thorsten

Ähnliche fragen