Newsgroup: it.comp.lang.visual-basic
Titolo: Errore nel salvare un PictureBox.Image  su file

Voglio salvare su un file una immagine creata su una PictureBox tramite 
un SaveFileDialog.
Il codice del SaveFileDialog (che si trova nel Form  fPlot)
ï¿œ il seguente :
         If SFD2.ShowDialog = Windows.Forms.DialogResult.OK Then
             pic1.Image.Save(SFD2.FileName)
         End If
Il codice di costruzione dell'immagine, che si trova in un modulo, ï¿œ il 
seguente :
         G = fPlot.pic1.CreateGraphics
         For i = 1 To 35000
             y = Random.Next(50) + 50
             points(i) = New Point(i * 2, y)
         Next
         G.DrawCurve(px, points, 1.0)
Sull'immagine, il plot viene perfettamente, solo che nel tentativo di 
salvarla, dopo aver messo nel dialogo il nome del file,
mi dï¿œ l'errore :
"NullReferenceException was unhandled"
"Use the 'new' keyword to create an object instance".
Ora io non so quale oggetto debba creare con 'new'.
E' tutto giï¿œ esistente, la PictureBox e il nome del file, che viene dato 
a runtime nel dialogo.
In un altro Form, con un altro SaveFileDialog (SFD1) salvo il contenuto 
di una RichtextBox su file e tutto funziona perfettamente.
Qualcuno ha una idea del perchï¿œ SFD2 non funziona ?

 Qualcuno ha una idea del perchè SFD2 non funziona ?
 
metti un breakpoint e scopri cosa è null, a naso scommetto sulla 
proprietà Image di pic1.
 
.m
 
-- 
è corta
 
 


Col breakpoint non riuscivo a vedere, ma ho fatto un test su pic1.Image 
ed ï¿œ risultata Null infatti.
Grazie.
Ora devo scovare il perchï¿œ ï¿œ nulla una image sulla quale ho plottato una 
curva poco prima col Drawcurve e che mi appare correttamente sullo schermo.

Ciao John,

perchï¿œ non stai disegnando sull'immagine (proprietï¿œ Image) ma sulla 
superfice del PictureBox, devi creare una Image, disegnandoci sopra lo 
stato attuale, prima di salvarla.
.m
-- 
ï¿œ corta



OK. Vado ad approfondire.  Pensavo che fosse automatico disegnare sulla 
superficie Image del PictureBox. Evidentemente non ï¿œ cosï¿œ.
Grazie.


prova così
 
        Dim bm As New Bitmap(pic1.Width, pic1.Height)
        pic1.BackColor = Color.WhiteSmoke
 
        Dim gr As Graphics = Graphics.FromImage(bm)
 
        Dim myPen As New Pen(Color.Red)
 
        myPen.Width = 4
        Dim apt(6) As Point
 
        apt(0) = New Point(100, 75)
        apt(1) = New Point(125, 50)
        apt(2) = New Point(80, 20)
        apt(3) = New Point(200, 75)
        apt(4) = New Point(30, 120)
        apt(5) = New Point(150, 75)
 
        gr.DrawCurve(myPen, apt)
 
        pic1.Image = bm
 
        pic1.Image.Save("c:\image.png")
 


Sì. Così funziona. Ma si deve costruire il plot su un Bitmap prima e poi 
ricopiarlo sul Pic1.Image.
Ma allora non vedo l'utilità del :
Dim G Graphics
G = pic1.CreateGraphics.
Evidentemente va bene solo se si vuole il plot sullo schermo.
OK. Grazie del feedback.
John.


 
 
Una domanda : perchè non dovrebbe funzionare anche
 
      Dim gr as Graphics = Graphics.FromImage(pic1.Image)  ???

       Dim gr as Graphics = Graphics.FromImage(pic1.Image)  ???
se Image non ï¿œ null certo che funziona, ma per una questione di 
performance sarebbe sempre meglio non creare oggetti Graphics a gogo ma 
utilizzare sempre e solo quello che arriva nell'evento OnPaint, se 
possibile.


 Am 10.10.2011 14:28, schrieb Sam:
zac
Hai esperienza di Photoshop o Gimp o Paint.net ?
Pensa la tua immagine come: Bitmap ï¿œ il background e Graphics un layer 
e tutto ti torna!
-- 
----- Italliaaaaa 3227! -----
Ho trovato una cittï¿œ di mattoni, ve la restituisco di marmo.
(Imperatore Augusto da Epistole)


 
OK. Grazie.