Picturebox inhalt speichern

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von DeathMaster.

    Picturebox inhalt speichern

    Hallo zusammen,

    folgendes Problem:
    Ich habe eine Picturebox (Genaugenommen handelt es sich um "Taskmanager Graph") die ich mit folgendem Code "bemalen" tuhe.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub GraphZeichnen(ByRef PictureBox As PictureBox, ByVal zeit As Double, ByVal prozent As Double, ByVal lastzeit As Double, ByVal lastprozent As Double)
    2. Dim path As New GraphicsPath()
    3. Dim steigung As Double
    4. Dim newkoordinate As Double
    5. Dim oldkoordinate As Double
    6. steigung = PictureBox.Height / 100.0
    7. oldkoordinate = PictureBox.Height - lastprozent * steigung
    8. newkoordinate = PictureBox.Height - prozent * steigung
    9. Dim points() As PointF = { _
    10. New Point(lastzeit, oldkoordinate), _
    11. New Point(zeit, newkoordinate)}
    12. path.AddCurve(points)
    13. Dim Zeichnen As Graphics = PictureBox.CreateGraphics
    14. Zeichnen.DrawPath(Pens.White, path)
    15. End Sub
    16. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    17. Kern1ProgressBar.Value = CPULastKern1
    18. TabKern2.Text = "Kern 2: " & CPULastKern1.ToString & " %"
    19. Kern2_newprozent = CPULastKern1
    20. Kern2_newtime = Kern2_cycletime
    21. GraphZeichnen(GraphKern2, Kern2_newtime, Kern2_newprozent, Kern2_oldtime, Kern2_oldprozent)
    22. Kern2_oldprozent = CPULastKern1
    23. Kern2_oldtime = Kern2_cycletime
    24. Kern2_cycletime += 1
    25. End Sub


    Nun zum Problem:
    Irgendwann mal ist die Picturebox "vollgemalt" und ich muss nun den Inhalt der Box verschieben (wie im Taskmanager).
    Leider habe ich keine Lösung dafür wie ich das machen soll.

    Die Ursprungsidee: das speichern der Picturebox funktioniert nicht!
    z.B. mit diesem Code:

    VB.NET-Quellcode

    1. Dim bmp As New Bitmap(GraphKern2.Width, GraphKern2.Height)
    2. GraphKern2.DrawToBitmap(bmp, New Rectangle(0, 0, GraphKern2.Width-1, GraphKern2.Height))
    3. GraphKern2.BackgroundImage = bmp

    geht nicht denn das "gezeichnete" wird gelöscht.


    Ich bitte mal um Lösungsansätze aller art ;)


    Danke
    Folgende Möglichkeit:
    Zeichne den Path nicht auf die PB sondern auf ein Bitmap in voller Länge.
    Dann kannst du mit DrawImage auf die PB zeichnen. DrawImage hat eine Überladung, in der du Ziel- und Quellrechteck angeben kannst. Damit kannst du einen beliebigen Ausschnitt deiner Kurve (auch gestreckt) abbilden.
    Fiel Fergnügen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Statt dem hier:

    VB.NET-Quellcode

    1. Dim Zeichnen As Graphics = PictureBox.CreateGraphics
    2. Zeichnen.DrawPath(Pens.White, path)

    Das hier:

    VB.NET-Quellcode

    1. Dim QuellRect, ZielRect As Rectangle
    2. Dim BMP As Bitmap 'Bild global deklarieren
    3. Sub Malen()
    4. BMP = New Bitmap(Höhe, Breite) 'Bild neu zeichnen
    5. Using Zeichnen As Graphics = Graphics.FromImage(BMP)
    6. Zeichnen.DrawPath(Pens.White, Path)
    7. End Using
    8. Using g As Graphics = PictureBox1.CreateGraphics
    9. g.DrawImage(BMP, QuellRect, ZielRect, GraphicsUnit.Pixel)
    10. End Using
    11. End Sub
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    hallo,

    danke eigentlich tut der Code hier:

    VB.NET-Quellcode

    1. Public Kern1_Bitmap As Bitmap
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. .
    4. .
    5. .
    6. Kern1_Bitmap = New Bitmap(GraphKern1.Height, GraphKern1.Width)
    7. .
    8. .
    9. .
    10. End Sub
    11. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    12. Kern0ProgressBar.Value = CPULastKern0
    13. TabKern1.Text = "Kern 1: " & CPULastKern0.ToString & " %"
    14. Kern1_newprozent = CPULastKern0
    15. Kern1_newtime = Kern1_cycletime
    16. GraphKern1.Image = GraphZeichnen2(GraphKern1, Kern1_newtime, Kern1_newprozent, Kern1_oldtime, Kern1_oldprozent)
    17. Kern1_oldprozent = CPULastKern0
    18. Kern1_oldtime = Kern1_cycletime
    19. Kern1_cycletime += 1
    20. End Sub
    21. Public Function GraphZeichnen2(ByRef PictureBox As PictureBox, ByVal zeit As Double, ByVal prozent As Double, ByVal lastzeit As Double, ByVal lastprozent As Double) As Bitmap
    22. Dim path As New GraphicsPath()
    23. Dim steigung As Double
    24. Dim newkoordinate As Double
    25. Dim oldkoordinate As Double
    26. steigung = PictureBox.Height / 100.0
    27. oldkoordinate = PictureBox.Height - lastprozent * steigung
    28. newkoordinate = PictureBox.Height - prozent * steigung
    29. Dim points() As PointF = { _
    30. New Point(lastzeit, oldkoordinate), _
    31. New Point(zeit, newkoordinate)}
    32. path.AddCurve(points)
    33. Dim QuellRect, ZielRect As Rectangle
    34. QuellRect = New Rectangle(0, 0, PictureBox.Width, PictureBox.Height)
    35. ZielRect = New Rectangle(0, 0, PictureBox.Width, PictureBox.Height)
    36. 'bitmap = New Bitmap(PictureBox.Height, PictureBox.Width) 'Bild neu zeichnen
    37. Using Zeichnen As Graphics = Graphics.FromImage(Kern1_Bitmap)
    38. Zeichnen.DrawPath(Pens.White, path)
    39. End Using
    40. Using g As Graphics = PictureBox.CreateGraphics
    41. g.DrawImage(Kern1_Bitmap, QuellRect, ZielRect, GraphicsUnit.Pixel)
    42. End Using
    43. Return Kern1_Bitmap
    44. End Function



    Nun das nächste Problem wo ich keinen ansatz finde:
    Sobald der Timer ca. 240 Zyklen durchlaufen hat, zeichnet der Code nichts mehr auf!
    hä?!

    gruss

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

    Ich glaub der Fehler liegt hier:

    VB.NET-Quellcode

    1. Kern1_Bitmap = New Bitmap(GraphKern1.Height, GraphKern1.Width)

    Graphkern1.Width liegt offenbar bei etwa 240. Die Breite deines Bitmap muss sich mit der Anzahl der aufgezeichneten Punkte erhöhen 8o
    Sonst zeichnest du neben dem Bild.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: