Picturebox Bild zeichnen und speichern

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Picturebox Bild zeichnen und speichern

    Hallo zusammen,

    Ich Zeichne wie Folgt in meine Picturebox:

    VB.NET-Quellcode

    1. Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As _
    2. System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    3. If e.Button = Windows.Forms.MouseButtons.Left Then
    4. pdraw = True
    5. lastPoint = e.Location
    6. End If
    7. End Sub
    8. Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As _
    9. System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    10. If pdraw AndAlso e.Location <> lastPoint Then
    11. Using g As Graphics = PictureBox1.CreateGraphics
    12. g.FillEllipse(New SolidBrush(cl), lastPoint.X - w \ 2,
    13. lastPoint.Y - w \ 2, w, w)
    14. g.DrawLine(New Pen(cl, w), lastPoint, e.Location)
    15. lastPoint = e.Location
    16. End Using
    17. End If
    18. End Sub
    19. Private Sub PictureBox1_MouseUp(ByVal sender As System.Object, ByVal e As _
    20. System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
    21. pdraw = False
    22. End Sub


    Nun möchte ich mein Gezeichnetes Bild abspeichern.
    Dazu habe ich mir foglendes zusammengestellt:

    VB.NET-Quellcode

    1. Private Sub btn_next_Click(sender As Object, e As EventArgs) Handles btn_next.Click
    2. Dim sfd As New SaveFileDialog
    3. sfd.Filter = ".jpg|*.jpg"
    4. sfd.AddExtension = True
    5. If sfd.ShowDialog = Windows.Forms.DialogResult.OK Then
    6. PictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg)
    7. End If
    8. End Sub

    Ich kann den Speicherort für das bild Wählen jedoch erhalte ich dann hier:

    VB.NET-Quellcode

    1. PictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg)

    die Fehlermeldung:
    System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    System.Windows.Forms.PictureBox.Image.get hat Nothing zurückgegeben.

    Kann mir jemand helfen?

    Dankeschön
    @schnibli

    das Image der PictureBox ist NULL.

    Du zeichnest zwar in deine Box aber es ist kein Image zugewiesen.

    C#-Quellcode

    1. Graphics graphics = Graphics.FromImage(Bitmap);



    Das dürfte dir weiterhelfen

    am ende dann einfach

    C#-Quellcode

    1. PictureBox1.Image = Bitmap;


    \\Edit: Danach kannst du dein Bild speichern
    LG

    Mausekeks
    Brain is Loading: 35%
    Sehe ich das richtig:

    VB.NET-Quellcode

    1. Dim bmp As Bitmap = CType(PictureBox1.Image, Bitmap)
    2. PictureBox1.Image = bmp
    3. Dim sfd As New SaveFileDialog
    4. sfd.Filter = ".jpg|*.jpg"
    5. sfd.AddExtension = True
    6. If sfd.ShowDialog = Windows.Forms.DialogResult.OK Then
    7. PictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg)
    8. End If

    schnibli schrieb:

    Sehe ich das richtig
    Das ist schneller ausprobiert als hier nachgefragt. ;)
    Du kannst auch eine Zeichen-Prozedur schreiben, die für sowohl Bitmaps als auch PictureBoxen geht, Du musst nur das jeweilige Graphics-Objekt übergeben.
    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!
    Ähm - bislang alles Holzweg.
    Fakt ist:
    Die Picbox hat in diesem Falle kein Image. Da wird auch so ein Unsinn nichts dran ändern:

    VB.NET-Quellcode

    1. Dim bmp As Bitmap = CType(PictureBox1.Image, Bitmap)
    2. PictureBox1.Image = bmp

    Es ist auch nicht nötig, dass die Picbox ein Image hat - bitte versucht das zu kapieren: Hier wird ein Problem gelöst, ohne Picbox.Image - ist das möglich?

    Was es gibt ist eine ZeichenRoutine. Die zeichnet in ein Graphics.
    Gib ihr die Graphics der PicBox, dann wird die Zeichnung auffm Bildschirm dargestellt.
    Gib ihr die Graphics einer Bitmap, dann wird die Zeichnung in der Bitmap dargestellt.
    Letzteres - die Bitmap - kann man abspeichern.

    Also:
    1. Erzeuge eine Bitmap in der gewünschten Größe.
    2. Erzeuge davon ein Graphics - Graphics.FromImage(bmp)
    3. übergib dieses Graphics der ZeichenFunktion, dass sie da hineinzeichne.
    4. Speicher die Bitmap
    5. Dispose das Graphics
    6. Dispose die Bitmap
    Hallo zusammen,

    Nun Habe ich das Zeichnen und Speichern geschafft:

    VB.NET-Quellcode

    1. Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    2. If e.Button = Windows.Forms.MouseButtons.Left Then
    3. pdraw = True
    4. lastPoint = e.Location
    5. End If
    6. End Sub
    7. Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    8. If pdraw AndAlso e.Location <> lastPoint Then
    9. Using g As Graphics = Graphics.FromImage(bmp)
    10. g.FillEllipse(New SolidBrush(cl), lastPoint.X - w \ 2, lastPoint.Y - w \ 2, w, w)
    11. g.DrawLine(New Pen(cl, w), lastPoint, e.Location)
    12. lastPoint = e.Location
    13. End Using
    14. End If
    15. PictureBox1.Image = bmp
    16. End Sub
    17. Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
    18. pdraw = False
    19. End Sub
    20. Me.bmp.Save(Path.Combine(FlexX_Datenverzeichnis, "test.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg)
    21. Me.Close()


    Leider habe ich jetzt noch das Problem dass, der Hintergrund beim Speichern auf Schwarz wechselt.
    Wie kann ich vorgeben das dieser Weiss sein soll?


    Gruss Schnibli
    @schnibli In jedem MouseMove hast Du ein Using, das ist suboptimal.
    Erstell die Bitmap bei MouseDown und finalisiere sie bei MouseUp.
    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!

    ErfinderDesRades schrieb:

    Es ist auch nicht nötig, dass die Picbox ein Image hat - bitte versucht das zu kapieren: Hier wird ein Problem gelöst, ohne Picbox.Image - ist das möglich?
    Hmm - Ist euch offsichtlich leider nicht möglich, zu kapieren.

    Performant nach Stand der Technik kann das so nicht werden.