2011-01-17 9 views
0

Ich versuche, GDI + zu verwenden, um zwei PNGs mit Transparenz, die ich in einer ImageList gespeichert habe, zusammenzuführen und dann in einer PictureBox anzuzeigen. Meine PictureBox-Größe, die erste Bildgröße und die zweite Bildgröße sind alle gleich. Ich dachte, das wäre einfach, aber der folgende Code funktioniert nicht und ich bin mir nicht sicher warum. Ich habe gesucht, aber ich konnte keine Code-Snippets speziell für PictureBoxes finden.Mischen von 2 transparenten Bildern in eine Picturebox

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    PictureBox1.Image = Nothing 
    Dim myGraphic As Graphics = PictureBox1.CreateGraphics 
    myGraphic.DrawImageUnscaled(ImageList1.Images(0), 0, 0) 
    myGraphic.DrawImageUnscaled(ImageList1.Images(1), 0, 0)   
End Sub 

Weiß jemand, was ich vermisst? In dem Moment, in dem ich auf die Schaltfläche klicke, sehe ich, wie die PictureBox für eine halbe Sekunde mit dem Bild flackert.

Vielen Dank im Voraus.

Antwort

0

Ahh jetzt verstehe ich, was ich falsch gemacht habe.

Hier ist mein überarbeiteter Code. Problem gelöst.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim newimage As New Bitmap(ImageList1.Images(0).Width, ImageList1.Images(0).Height) 
     Dim g As Graphics = Graphics.FromImage(newimage) 
     g.DrawImage(ImageList1.Images(0), 0, 0) 
     g.DrawImage(ImageList1.Images(1), 0, 0) 
     PictureBox1.Image = newimage 
     g.Dispose()  
End Sub 
0

Als Erstes zeichnen Sie die Bilder an genau derselben Stelle, sodass Sie riskieren, dass ein Bild das andere vollständig überschreibt.

Das heißt, es ist nicht genug, nur auf die Grafik zu zeichnen. Sie müssen auch das Bildfeld-Steuerelement ungültig machen. Dies wird es zwingen, sich neu zu zeichnen.

Als ein grober Test mit Ihrem aktuellen Programm können Sie es minimieren und dann maximieren und sehen, ob die PNGs da sind. Dies wird auch zwingen, die Bildbox neu zu zeichnen.

+0

Danke für die Antwort. Es soll es überschreiben, weil das zweite Bild ein Overlay mit Transparenz ist. Ein Beispiel von dem, was ich versuche zu erreichen, kann hier gefunden werden: http://www.codeproject.com/KB/cs/Merge_Images_in_C_.aspx Ich möchte das tun, aber anstatt in eine Datei zu schreiben, möchte ich es in einem zeigen PictureBox (und mein Programm ist in VB.Net nicht C#). Könnten Sie bitte erklären, was Sie meinen, indem Sie die Picturebox für ungültig erklären? Und ich versuchte das Minimieren/Maximieren, aber nichts passierte. – quantum

+0

Einfach: Rufen Sie einfach die Control.Invalidate() -Methode auf. Siehe hier: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invalidate(v=vs.71).aspx Es existiert, weil das Zeichnen auf den tatsächlichen Bildschirm ein kostspieliger Prozess ist. Anstatt also jeden Schritt jedes Objekts, das Sie auf eine zeichnerische Oberfläche zeichnen, zu zeigen, zeichnen Sie alles und erzählen der Oberfläche, dass sie sich selbst aktualisiert. Das heißt, ich glaube, du gehst mit deiner Herangehensweise den falschen Weg. Sie sollten alle Zeichnungslogik in das ** Paint-Ereignis ** des Steuerelements einfügen. – Pedery

Verwandte Themen