Picturebox naar bmp-file saven : Object reference not set to an instance of an object

Status
Niet open voor verdere reacties.

evertVB

Gebruiker
Lid geworden
6 apr 2009
Berichten
570
Ik heb een picturebox op mijn form en daar heb ik al van alles op getekend als ik btnSaveImage aanklik:
Code:
    Private Sub btnSaveImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveImage.Click
        Dim FileName As String
        FileName = "D:\ekarman\Documents\Persoonlijk\A\PictureBoxContent.bmp"
        MsgBox("Begin saving picture to : " & FileName)
        PictureBox1.Image.Save(FileName, System.Drawing.Imaging.ImageFormat.Bmp)
        MsgBox("Finished saving picture to : " & FileName)
    End Sub

Ik wil dus datgene wat getekend is op Picturebox1 opslaan in een bmp-file.

Maar ik krijg een exception op deze regel:
Code:
        PictureBox1.Image.Save(FileName, System.Drawing.Imaging.ImageFormat.Bmp)
Het gaat om een NullReferenceException: "Object reference not set to an instance of an object."

Wat moet ik hieraan doen? er is al een picturebox en er is al op getekend...?
Welk object wil hij dan nog hebben?
:confused::confused:
 
Heeft iemand misschien nog een idee?
Ik wil alleen maar een picturebox in een bmp-file saven.
Is er misschien andere code waarmee dit kan?
Bij voorbaat hartelijk dank:)
 
" en er is al op getekend..."
Doe je dit door e.Graphics.Draw... in de PictureBox1.Paint event?
Of zet je er een afbeelding in, met de property PictureBox1.Image?
 
Met Graphics.draw
Ik heb polygons getekend en die wil ik in een bmp-file hebben.
 
Je moet de Grapichs opslaan, jij slaat nu de Image op maar als je nooit een image ingesteld hebt, gaat dat moeilijk.

Kijk hier eens...:thumb:
 
Ik ben er mee aan het stoeien en ik kom er niet uit. De voorbeeldcode daar gaat van een hele andere programma-opzet uit, zo lijkt het wel.

Ik heb nu dit:

Code:
    Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim i As Integer

        PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        e.Graphics.FillRectangle(Brushes.White, 0, 0, PictureWidth, PictureHeight)

        For i = 0 To 3
            e.Graphics.DrawLine(Pens.Black, px(i), py(i), px(i + 1), py(i + 1))
        Next i

        e.Graphics.DrawLine(Pens.Black, px(0), py(0), px(4), py(4))

        e.Graphics.FillRectangle(Brushes.Black, xz - 1, yz - 1, 2, 2)

    End Sub

    Private Sub btnSaveImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveImage.Click
        Dim FileName As String

        FileName = "D:\ekarman\Documents\Persoonlijk\A\PictureBoxContent.bmp"
        MsgBox("Begin saving picture to : " & FileName)

        PictureBox1.Image.Save(FileName)

        MsgBox("Finished saving picture to : " & FileName)
    End Sub

Het enige wat ik uit de voorbeeldcode heb gehaald is:

Code:
        PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)

Mijn error treedt niet meer op.
Maar helaas staat er ook geen polygon in de bmp-file.

Ik wilde ook gaan toevoegen:

Code:
        e.Graphics = Graphics.FromImage(img)
Maar de compiler vindt dit niet goed: e.Graphics is read-only.

Hoe kan ik die voorbeeldcode gebruiken binnen mijn huidige paint- en clickroutine?
 
Hehe, ik heb een werkende methode gevonden:

Code:
        Dim image As New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
        Dim gr As Graphics = Graphics.FromImage(image)

        Dim a As Integer = Me.ClientSize.Width \ 10

        For x As Integer = 0 To a Step +1
            gr.DrawLine(Pens.Black, (x * 10), 0, (x * 10), Me.ClientSize.Height)
        Next

        Dim b As Integer = Me.ClientSize.Height \ 10

        For x As Integer = 0 To b Step +1
            gr.DrawLine(Pens.Black, 0, (x * 10), Me.ClientSize.Width, (x * 10))
        Next

        gr.Dispose()
        image.Save("G:\Overige\g.bmp")
        image.Dispose()

Echter als je het zichtbaar wilt laten zijn, moet je zowel in de picturebox(?) tekenen en in 'gr':thumb:
 
1000 maal dank!

In dat polygonen project heb ik het nu zo gedaan - m.b.v. jouw code:

Code:
    Private Sub Polygon2Graphics(ByRef gr As Graphics)
        Dim i As Integer

        gr.FillRectangle(Brushes.White, 0, 0, PictureWidth, PictureHeight)

        For i = 0 To 3
            gr.DrawLine(Pens.Black, px(i), py(i), px(i + 1), py(i + 1))
        Next i

        gr.DrawLine(Pens.Black, px(0), py(0), px(4), py(4))

        gr.FillRectangle(Brushes.Black, xz - 1, yz - 1, 2, 2)
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Polygon2Graphics(e.Graphics)
    End Sub

    Private Sub btnSaveImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveImage.Click
        Dim image As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
        Dim gr As Graphics = Graphics.FromImage(image)

        Polygon2Graphics(gr)

        gr.Dispose()
        MsgBox("Start saving image")
        image.Save("D:\ekarman\Documents\Persoonlijk\A\Polygons.bmp")
        MsgBox("Finished saving image")
        image.Dispose()
    End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan