Gezeichnetes Bild per Button in neues Bild zeichnen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Steppenpferd.

    Gezeichnetes Bild per Button in neues Bild zeichnen

    Hallo,
    ich habe im Paint-Event einer PictureBox1 ein Bild erstellt. Hierzu wurden alle Einzelbilder einer Liste aneinander gereiht.
    Das Bild wird in der PictureBox1 ohne Probleme angezeigt.

    Jetzt würde ich gerne per Button1 einen Teil aus PictureBox1 per Paint Event in PictureBox2 Zeichen.
    PictureBox2.Size wurde bereits im Paint-Event von PictureBox1 definiert.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. PictureBox2.Refresh()
    3. End Sub


    VB.NET-Quellcode

    1. Private Sub PictureBox2_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint
    2. With e.Graphics
    3. Dim bmp As New Bitmap(PictureBox1.Image)
    4. Dim tmpBrush As New TextureBrush(bmp)
    5. .FillRectangle(tmpBrush, New Rectangle(New Point(Index * PictureBox2.Width, 0), New Size(PictureBox2.Width, PictureBox2.Height)))
    6. End With
    7. End Sub


    PictureBox1.Image ist leider = Nothing

    Was mache ich falsch?

    *Topic verschoben, das ist kein VBScript*
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Setzt du denn das Image der Picturebox oder zeichnest du einfach auf die Picturebox?
    Wenn 2. dann am besten auf ein Bitmap zeichnen und das in der Picturebox zeichnen, das kannst du dann auch für PB2 verwenden.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Das sollte gehen:

    VB.NET-Quellcode

    1. ​Private Sub PictureBox2_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint
    2. Dim bmp As New Bitmap(PictureBox1.Image)
    3. Dim tmpBrush As New TextureBrush(bmp)
    4. Dim graph As Graphics = Graphics.FromImage(bmp)
    5. graph.FillRectangle(tmpBrush, New Rectangle(New Point(Index * PictureBox2.Width, 0), New Size(PictureBox2.Width, PictureBox2.Height)))
    6. PictureBox2.Image = bmp
    7. End Sub
    Bei den Maßen der Einfachheit stößt man an Grenzen, aber: "Es geht immer komplizierter".
    Für PictureBox1:

    VB.NET-Quellcode

    1. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    2. Dim bmp As New Bitmap(New Size(PictureBox2.Width, PictureBox2.Height))
    3. Dim graph As Graphics = Graphics.FromImage(bmp)
    4. 'Hier den Code zum Zeichnen
    5. PictureBox1.Image = bmp
    6. End Sub
    Bei den Maßen der Einfachheit stößt man an Grenzen, aber: "Es geht immer komplizierter".
    @Steppenpferd Willkommen im Forum. :thumbup:
    Bevor Du hier rumcodest sollten wir erst mal besprechen, was da eigentlich ablaufen soll.
    Dein Problem sieht mir so aus, als ob wir es relativ einfach lösen könnten.
    Also:
    Wo kommen die Bilder her, wo sollen sie hin, wie werden sie dabei manipuliert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke an Euch alle,
    Ich war wohl zu sehr auf die PictureBox und auf das Paint Event fixiert. Mono hat mir die Augen geöffnet.

    Hier mal die Lösung meines Problems.
    Das im Beispiel verwendete Image hat 4 Reihen a 25 Bilder und dient einer Animation für links, rechts, hoch, runter Bewegungen.
    Es wird das 13te Bild (Index=12) aus Reihe 2 (Index=1) zurückgegeben.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. picPlayer.Image = GetStripePart(picStripe.Image, 25, 4, 12, 1)
    3. End Sub

    VB.NET-Quellcode

    1. 'zeichent ein Einzelbild aus einem Filmstreifen auf eine neue Bitmap, und gibt diese an das aufrufende Objekt zurück
    2. Function GetStripePart(ByVal srcBitmap As Bitmap, ByVal srcBitmapCols As Integer, ByVal srcBitmapRows As Integer, _
    3. ByVal srcBitmapColIndex As Integer, ByVal srcBitmapRowIndex As Integer) As Bitmap
    4. Dim SinglepicWidth As Integer = CInt(srcBitmap.Width / srcBitmapCols) 'Einzelbildbreite berechnen
    5. Dim SinglepicHeight As Integer = CInt(srcBitmap.Height / srcBitmapRows) 'Einzelbildhöhe berechnen
    6. Dim srcRect As Rectangle = New Rectangle(CInt(srcBitmapColIndex * SinglepicWidth), CInt(srcBitmapRowIndex * SinglepicHeight), SinglepicWidth, SinglepicHeight)
    7. Dim dstRect As Rectangle = New Rectangle(0, 0, SinglepicWidth, SinglepicHeight)
    8. Dim NewBitmap As New Bitmap(SinglepicWidth, SinglepicHeight) 'leere Bitmap erstellen
    9. Using G As Graphics = Graphics.FromImage(NewBitmap) 'Graphics-Object von newBitmap erstellen
    10. G.DrawImage(srcBitmap, dstRect, srcRect, GraphicsUnit.Pixel) 'Einzelbild zeichnen
    11. End Using
    12. Return NewBitmap 'das Einzelbild an das aufrufende Objekt zurückgeben
    13. End Function

    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Steppenpferd“ ()