Problem mit Darstellung in PictureBox

05/05/2009 - 15:12 von Alfred Sauerland | Report spam
Hallo NG,

die Situation kurz erklàrt: Ich habe eine PictureBox und zeichne auf Klick
darauf mittels DrawImage ein weiteres Bild darauf. Im Tag-Parameter würde
ich mir gerne das Ursprungsbild merken, da ein weiterer Klick darauf wieder
das Ausgangsbild anzeigen soll. Ich löse das so:

If pb.Tag Is Nothing Then
pb.Tag = pb.Image
Dim img As Image = Image.FromFile(sPfad & "ArrLeft.png")
Dim imgP As Image = pb.Image
Using g As Graphics = Graphics.FromImage(imgP)
g.InterpolationMode =
Drawing2D.InterpolationMode.HighQualityBicubic
g.DrawImage(img, 0, 0)
End Using
pb.Image = imgP
Else
pb.Image = DirectCast(pb.Tag, Image)
pb.Tag = Nothing
End If

Das Problem ist nun, daß zwar in den Else-Zweig gesprungen wird, aber nicht
mehr das Ausgangsbild zum Vorschein kommt, sondern immer das, auf das ich
drauf gezeichnet habe. Meine Vermutung ist daß es mit irgendeiner By
Reference Übergabe zu tun hat, liege ich richtig? Oder liegt mein Problem an
anderer Stelle?

Grüße,

Alfred
 

Lesen sie die antworten

#1 Armin Zingler
05/05/2009 - 17:12 | Warnen spam
Sorry, falls Doppelposting. Das erste erscheint bei mir nicht.



Alfred Sauerland wrote:
Hallo NG,

die Situation kurz erklàrt: Ich habe eine PictureBox und zeichne auf
Klick darauf mittels DrawImage ein weiteres Bild darauf.



Auf der Picturebox oder auf dem Bild, das der Image-Eigenschaft der
Picturebox zugewiesen wird?

Im
Tag-Parameter würde ich mir gerne das Ursprungsbild merken, da ein
weiterer Klick darauf wieder das Ausgangsbild anzeigen soll. Ich löse
das so:
If pb.Tag Is Nothing Then
pb.Tag = pb.Image
Dim img As Image = Image.FromFile(sPfad & "ArrLeft.png")
Dim imgP As Image = pb.Image
Using g As Graphics = Graphics.FromImage(imgP)
g.InterpolationMode > Drawing2D.InterpolationMode.HighQualityBicubic
g.DrawImage(img, 0, 0)
End Using
pb.Image = imgP
Else
pb.Image = DirectCast(pb.Tag, Image)
pb.Tag = Nothing
End If

Das Problem ist nun, daß zwar in den Else-Zweig gesprungen wird, aber
nicht mehr das Ausgangsbild zum Vorschein kommt, sondern immer das,
auf das ich drauf gezeichnet habe. Meine Vermutung ist daß es mit
irgendeiner By Reference Übergabe zu tun hat, liege ich richtig? Oder
liegt mein Problem an anderer Stelle?



Ich kann zu deiner Lösung kaum etwas sagen weil sich mir mehrere Fragen
aufwerfen: (die du nicht beantworten brauchst weil ich unten sowieso einen
anderen Ansatz vorschlage)

- Wurde das Originalbild schon zuvor zur Image-Eigenschaft zugewiesen?
- Sind es immer dieselben (beiden) Bilder?
- Warum zeichnest du jedes Mal "Arrleft.png" auf das Bild? Einmal würde
genügen; das Ergebnis dann vorhalten.
- Wird bei g.DrawImage das komplette Bild ausgefüllt? Wenn ja, warum
zeichenst du dann überhaupt wenn das Ergebnis doch dem Original entspricht?
- Bringt der InterpolationMode überhaupt etwas, wenn das Bild in der
Originalgröße gezeichnet wird?
- Mit By Reference hat das gar nichts zu tun da du ja keine (eigene)
Prozedur aufrufst.

Dass du immer dasselbe Bild angezeigt bekommst liegt daran, dass du nur ein
einziges Bild anzeigst. Das wird bei jedem zweiten Klick mit Arrleft.png
überpinselt, wobei es ab dem zweiten Mal dann natürlich überflüssig ist.

Da ich jetzt nicht weiß, ob Arrleft.png kleiner als das Originalbild ist,
schlage ich mal folgendes vor: (natürlich ungetestet...)

Public Class Form1

Private f_Image1, f_Image2 As Image

Private Sub Form1_Load( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load

Dim img = Image.FromFile("arrleft.png")

f_Image1 = Image.FromFile("original.bmp")
f_Image2 = New Bitmap(f_Image1)

Using g = Graphics.FromImage(f_Image2)
g.DrawImageUnscaled(img, 0, 0)
End Using

PictureBox1.Image = f_Image1

End Sub

Private Sub PictureBox1_Click( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles PictureBox1.Click

If PictureBox1.Image Is f_Image1 Then
PictureBox1.Image = f_Image2
Else
PictureBox1.Image = f_Image1
End If
End Sub

End Class


Armin

Ähnliche fragen