View Full Version : [VB.NET]Salvare immagine da picturebox a file
Capello82
14-05-2008, 09:33
Salve a tutti. Non riesco a salvare il contenuto visualizzato nella picturebox in un file.
Uso il seguente codice
PictureBox1.Image.Save("c:\temp.jpg", Imaging.ImageFormat.jpeg)
e quando lo eseguo l'errore è "Riferimento a un oggetto non impostato su un'istanza di oggetto."
Come posso risolverlo? ^^
Capello82
15-05-2008, 10:03
UPPO specificando che l'immagine che devo salvare su file è composta da componenti di grafica di tipo "Drawline"....
La Image di una PictureBox e' una Image che hai settato tu manualmente, e non e' il risultato di operazioni grafiche.
se non la setti, restera' vuota (peggio, nulla, ovvero non esiste).
Per poter risolvere questo problema dovresti prima creare tu una Image, prenderci il Graphics e scriverci dentro con le drawline etc.
Poi settare la Image alla PictureBox oppure fare un Blit sul graphic della PictureBox quando occorre l'evento OnDraw.
(Questo fra l'altro risolve anche il problema del Repaint, perche' ora se metti una finestra sopra la tua e poi la togli, il tuo disegno sparisce).
A questo punto potrai salvare l'immagine quando credi.
Capello82
15-05-2008, 15:07
Non sono ancora molto esperto del linguaggio. Se potessi farmi qualche breve esempio te ne sarei grato ^^
Inoltre cos'è un blit?
Salve a tutti. Non riesco a salvare il contenuto visualizzato nella picturebox in un file.
Uso il seguente codice
PictureBox1.Image.Save("c:\temp.jpg", Imaging.ImageFormat.jpeg)
e quando lo eseguo l'errore è "Riferimento a un oggetto non impostato su un'istanza di oggetto."
Come posso risolverlo? ^^
Io risolverei scrivendo su una bitmap "di sfondo", che carichi in memoria all'inizio del processo di disegno.
In qualsiasi momento puoi sincronizzare il contenuto della PictureBox con la bitmap e ovviamente salvare nel formato che vuoi...
Una cosa del genere :
Dim sfondoImg As Image = Image.FromFile("C:\blank.bmp")
Dim G As Graphics = Graphics.FromImage(sfondoImg)
'Disegno qualcosa sullo sfondo :
Dim penna As New System.Drawing.Pen(System.Drawing.Color.Red)
penna.Width = 2
Dim i As Integer = 0
For i = 1 To 10
G.DrawLine(penna, 0, i * 50, 500, i * 50)
Next
'Sincronizzo l'immagine con quella visualizzata nella PictureBox :
PictureBox1.Image = sfondoImg
'Salvo l'immagine :
sfondoImg.Save("C:\output.bmp", Imaging.ImageFormat.Bmp)
- blank.bmp è una bmp ad es. 800x600 bianca ( stesse dimensioni della PictureBox1 )... Prova. ;)
Capello82
18-05-2008, 17:44
Grazie, potrei fare così, ma preferirei non dover partire da un altro file, come blank.bmp...
Grazie, potrei fare così, ma preferirei non dover partire da un altro file, come blank.bmp...
E' il modo giusto infatti, lo stesso che avevo descritto anche io sopra.
Ma non e' necessario partire da un'immagine vera.
Tra i costruttori c'e' anche quello in cui si specifica larghezza, altezza e formato colore. (24bit o 32bit per il true color che normalmente si usa)
Capello82
18-05-2008, 19:39
E' il modo giusto infatti, lo stesso che avevo descritto anche io sopra.
Ma non e' necessario partire da un'immagine vera.
Tra i costruttori c'e' anche quello in cui si specifica larghezza, altezza e formato colore. (24bit o 32bit per il true color che normalmente si usa)
Ah non avevo capito allora ^^ Domani mattina provo e ti faccio sapere.
Grazie, potrei fare così, ma preferirei non dover partire da un altro file, come blank.bmp...
Questione di dettagli...
Creare la Bmp da file ti da alcuni vantaggi/svantaggi che devi valutare tu, non è assolutamente necessario e comunque su disco devi scrivere perciò non vedo perchè tu non voglia leggere...
In ogni caso la Bmp in memoria la devi creare, e in questo modo lo puoi fare senza file-sfondo di partenza :
Dim sfondoImg As New Bitmap(PictureBox1.Width, PictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
Dim G As Graphics = Graphics.FromImage(sfondoImg)
'Creo lo sfondo ( default nero ):
G.FillRectangle(New SolidBrush(Color.White), New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height))
'Disegno qualcosa sullo sfondo :
Dim penna As New System.Drawing.Pen(System.Drawing.Color.Red)
penna.Width = 2
Dim i As Integer = 0
For i = 1 To 10
G.DrawLine(penna, 0, i * 50, 500, i * 50)
Next
'Sincronizzo l'immagine con quella visualizzata nella PictureBox :
PictureBox1.Image = sfondoImg
'Salvo l'immagine :
sfondoImg.Save("C:\output.bmp", Imaging.ImageFormat.Bmp)
Come vedi, molto simile al mio codice precedente... ;)
Capello82
19-05-2008, 09:09
Ho provato e mi salva solo lo sfondo nel file output.bmp, che tra l'altro photoshop non riesce nemmeno ad aprire O.o
Ho provato e mi salva solo lo sfondo nel file output.bmp, che tra l'altro photoshop non riesce nemmeno ad aprire O.o
:rolleyes:
Hai fatto qualche casino tu, perchè io non ho nessun problema nè col codice ( che infatti non continene manco Try Catch ), nè con l'output.
E inoltre lo apro tranquillamente con CS2 :
:read:
http://thumbnails7.imagebam.com/646/6f0b4c6452923.gif (http://www.imagebam.com/image/6f0b4c6452923)
Capello82
19-05-2008, 09:21
Risolto in parte; facevo disegnare le linee con il metodo "Drawline" della picturebox1 invece che con quello di "G". Tuttavia non riesco ancora ad aprire l'immagine con CS3, ma solo con paint di Windows... bo. Non che sia importante, però è strano :muro:
Risolto in parte; facevo disegnare le linee con il metodo "Drawline" della picturebox1 invece che con quello di "G".
Eh ! :doh: :D
Tuttavia non riesco ancora ad aprire l'immagine con CS3, ma solo con paint di Windows... bo. Non che sia importante, però è strano :muro:
Questo è davvero strano, CS2 lo apre e CS3 no ???
Una bella domanda da porre agli espertoni di Photoshop ! ;)
schumi84
12-03-2010, 15:52
ciao a tutti.. ho un problema simile. ho un picture box grande, sopra di questa ho creato una più piccola. vorrei salvare alla fine un file jpg che sia il risultato della grande+la piccola. si può fare? grazie mille. uso vb.net
ciao a tutti.. ho un problema simile. ho un picture box grande, sopra di questa ho creato una più piccola. vorrei salvare alla fine un file jpg che sia il risultato della grande+la piccola. si può fare? grazie mille. uso vb.net
Semplice, a patto che :
1. La PictureBox di sfondo contenga interamente la PictureBox in primo piano.
2. La proprietà BorderStyle di entrambe sia = None.
3. La proprietà SizeMode di entrambe sia = Normal.
Dette rispettivamente "pcb_sfondo" e "pcb_primopiano" le due PictureBox :
Dim bmpSfondo As New Bitmap(pcb_sfondo.Image)
Dim bmpPrimoPiano As New Bitmap(pcb_primopiano.Image)
Dim X As Integer = pcb_primopiano.Left - pcb_sfondo.Left
Dim Y As Integer = pcb_primopiano.Top - pcb_sfondo.Top
Graphics.FromImage(bmpSfondo).DrawImage(bmpPrimoPiano, X, Y)
bmpSfondo.Save(percorso & "output.jpg", Imaging.ImageFormat.Jpeg)
;)
Il codice è scritto in Visual Basic 2010 Express, ma penso che funzioni anche in Vb.Net.
Nel Form inserire una PictureBox [PictureBox1] e un Button rinominandolo cmdSalva.
Caricare un'immagine in PictureBox1 da progetto o da codice.
Codice:
Private Sub cmdSalva_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSalva.Click
Dim bmpImmagine As New Bitmap(PictureBox1.Image)
bmpImmagine.Save("C:\" & "output.jpg", Imaging.ImageFormat.Jpeg)
End Sub
Nota : il codice funziona qualunque siano i settaggi di PictureBox1.
thedoktor84
10-04-2015, 16:17
Salve a tutti. Non riesco a salvare il contenuto visualizzato nella picturebox in un file.
Uso il seguente codice
PictureBox1.Image.Save("c:\temp.jpg", Imaging.ImageFormat.jpeg)
e quando lo eseguo l'errore è "Riferimento a un oggetto non impostato su un'istanza di oggetto."
Come posso risolverlo? ^^
stai lavorando con un oggetto in una form quindi .... crea una riferimento usando la parola NEW
"c:\temp.jpg" e veramente pessimo
devi prima controllare se è attivo UAC nel tuo sistema se è attivo
e l'applicativo non dispone di privilegi di admin non puoi droppare li
quindi devi usare un pajo di api per vedere se sei admin e se l'uac e attivo
se in caso non lo sei devi droppare in appdata o temp
e consiglio sempre e comunque di usare environ :)
[Kendall]
10-04-2015, 16:23
14/05/2008 ?
:asd:
thedoktor84
10-04-2015, 17:07
;42356056']14/05/2008 ?
:asd:
LoL si in effetti, non ci avevo fatto caso perche l'utente prima di me aveva risposto oggi :)
Stavo per rispondere a MarcoGG e scrivere:
"... Windows XP nel 2015? :eek:"
:asd:
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.