Afbeelding picturebox opslaan

Status
Niet open voor verdere reacties.

basparky

Gebruiker
Lid geworden
11 jan 2012
Berichten
10
Hi,

Ik teken met eerder gekregen hulp op dit forum in een picturebox. Ik wil de weergegeven afbeelding op kunnen slaan.
Nu dacht ik met het volgende stukje dit te kunnen realiseren, maarrrrr... Het geeft een foutmelding null reference.. Er zit niets in de picturebox.

Hoe kan ik de actuele weergave van een picturebox opslaan als jpg?

Alvast bedankt voor de suggesties!

Code:
    Private Sub btnSavePicture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSavePicture.Click
        Dim saveFileDialog1 As New SaveFileDialog()
        saveFileDialog1.Filter = "Picture files (*.jpg)|*.jpg|All files (*.*)|*.*"
        'saveFileDialog1.FilterIndex = 2
        saveFileDialog1.RestoreDirectory = True
        saveFileDialog1.ShowDialog()
        ' If the file name is not an empty string open it for saving.
        If saveFileDialog1.FileName <> "" Then
            ' Saves the Image via a FileStream created by the OpenFile method.
            Dim fs As System.IO.FileStream = CType _
               (saveFileDialog1.OpenFile(), System.IO.FileStream)
            PictureBox1.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg)
            fs.Close()
        End If
    End Sub
 
OP welke regel krijg je de null reference? heb je met een breakpoint en local variables viewer gechecked of bijvoorbeeld "fs" wel een geldige stream teruggeeft?

overigens kun je ook de filename en locatie direct ingeven bij image.save zonder eerst een externe filestream aan te maken.
 
Bedankt voor je reactie.
Ik krijg een NullReferenceException op de regel:

Code:
 PictureBox1.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg)
 
Laatst bewerkt door een moderator:
En heb je met een breakpoint en local variable view gecontroleerd dat FS gevult is?
 
De fs geeft niet het probleem. Het is Picturebox1.image welke leeg is wanneer ik deze wil op slaan. Wanneer ik in de properties van picturebox1 een image ingeef dan slaat hij deze keurig op bij uitvoeren van bovenstaande script.

Ik heb dus een picturebox met backgroundimage, teken hier in mbv een script en wil vervolgens een plaatje van het geheel opslaan (background + ingetekende).

Bedankt voor de hulp zover.
 
Laatst bewerkt door een moderator:
Maar heb je dan een image toegewezen? In de bovenstaande code zit de fout an sich niet.
 
Als ik in de properties een image toewijs dan werkt het. Dit is dan echter een image uit een bestand.
Wanneer ik hier geen image toewijs en in de picturebox mbv het volgende scriptje wat teken en dit vervolgens wil opslaan lukt dit niet. Ergens moet ik dus de huidige weergave in de picturebox als image toewijzen denk ik.
Code:
               For z = 0 To 500 'aantal strengen met 3 als x afstand
                    For m = 0 To 209 '210 beams * 3 pixels
                        If (output1(z)(m)) = "1" Then
                            If CheckBox1.Checked = False Then
                                graphics.FillRectangle(MyOrBrush, z * 3 + 0, m * 3 + 0, 3, 3)
                            Else
                                graphics.FillRectangle(MyNewBrush, z * 3 + 0, m * 3 + 0, 3, 3)
                            End If
                        End If
                    Next
                Next
 
Met de volgende oplossing lukt het.. Neem aan dat dit niet de juiste methode is maar het werkt wel:)

Code:
    Private Sub btnSavePicture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSavePicture.Click
        Dim area As Rectangle = Me.PictureBox1.Parent.RectangleToScreen(Me.PictureBox1.Bounds)
        '' MsgBox(Me.PictureBox1.Bounds.ToString)
        Dim capture As System.Drawing.Bitmap
        Dim graph As Graphics
        Dim saveFileDialog1 As New SaveFileDialog()

        capture = New System.Drawing.Bitmap(PictureBox1.Bounds.Width, PictureBox1.Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        graph = Graphics.FromImage(capture)
        graph.CopyFromScreen(area.X, area.Y, 0, 0, area.Size, CopyPixelOperation.SourceCopy)

        saveFileDialog1.Filter = "Picture files (*.jpg)|*.jpg|All files (*.*)|*.*"
        'saveFileDialog1.FilterIndex = 2
        saveFileDialog1.RestoreDirectory = True
        saveFileDialog1.ShowDialog()
        ' If the file name is not an empty string open it for saving.

        If saveFileDialog1.FileName <> "" Then
            ' Saves the Image via a FileStream created by the OpenFile method.
            Dim fs As System.IO.FileStream = CType _
               (saveFileDialog1.OpenFile(), System.IO.FileStream)
            capture.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg)
            fs.Close()
        End If
    End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan