Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Visualizzare una immagine memorizzata come byte[]
martedì 02 febbraio 2010 - 18.56
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
iako17
Profilo
| Newbie
49
messaggi | Data Invio:
mar 2 feb 2010 - 18:56
Ciao ragazzi,
sto sviluppando una applicazione in grado di scattare una foto e di memorizzarla all'interno del DB come tipo LONGBLOB. (Utilizzo MySQL come DBMS). In realtà, per memorizzare la bitmap faccio prima una conversione da bitmap in byte[] in maniera tale da poter inserire l'array byte[] nel campo di db longblob. Posto subito il codice che mi permette di effettuare questa prima conversione:
public static byte[] Bitmap2ByteArray(Bitmap image)
{
MemoryStream stream = new MemoryStream();
image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
return stream.ToArray()
}
Questo array di byte, come detto prima, lo inserisco nel campo longblob del db. Quando recupero l'array di byte dal db, però, mi viene sollevata una eccezione di tipo System.ArgumentException. Posto il codice che mi dovrebbe permette di recuperare l'array byte[], convertirlo in bitmap e di mostrare l'immagine.
System.IO.MemoryStream stream = new System.IO.MemoryStream(array byte[] memorizzato nel db);
Bitmap image = new Bitmap(stream); // qui mi viene sollevata l'eccezione
this.pictureBox1.Image = image;
this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
Non capisco il perchè di questa eccezione. Ho provato ad utilizzare lo stesso codice con una immagine che non viene memorizzata all'interno del db, ma su cui faccio la conversione bitmap -> byte[] -> bitmap e tutto funziona. allora, credo che si verifichi qualcosa di strano quando memorizzo l'array di byte all'interno del db.
Qualcuno è in grado di darmi qualche suggerimento?
Ciao e grazie.
ysdemarc
Profilo
| Expert
587
messaggi | Data Invio:
mer 3 feb 2010 - 11:34
prova a fare così:
System.IO.MemoryStream stream = new System.IO.MemoryStream(array byte[]);
System.Drawing.Image img= System.Drawing.Image.FromStream(stream);
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(img, img.Size);
this.pictureBox1.Image = bmp; //oppure credo che anche l'oggetto Image andrebbe bene..
comunque verifica che stream abbia qualche valore..
ciao
Vincenzo
Programmatore sbilenco
iako17
Profilo
| Newbie
49
messaggi | Data Invio:
mer 3 feb 2010 - 17:53
Ciao e grazie per aver risposto.
Credo che il problema non fosse in fase di recupero dell'immagine, bensì in fase di memorizzazione. Per questo motivo ho provato a cambiare un po' di cose, solo che ora non riesco ad inserire l'immagine nel campo BLOB di mysql.
Provo a postare il nuovo problema sperando che qualcuno sia in grado di aiutarmi:
OdbcCom = new OdbcCommand("INSERT INTO photo(img_photo) VALUES(?)", connessione);
OdbcParameter s = new OdbcParameter("@img_photo", OdbcType.Binary);
s.Value = photo; // è l'immagine che provo a memorizzare che ho convertito in byte[]
s.Size = photo.Length;
OdbcCom.Parameters.Add(s);
OdbcCom.ExecuteNonQuery();
Qui credo che il problema sia dovuto a quell' OdbcType.Binary. Ho provato con OdbcType.Image ma nulla. Quello che faccio è provare a memorizzare in un campo di db di tipo BLOB un valore byte[].
Ciao e grazie
ysdemarc
Profilo
| Expert
587
messaggi | Data Invio:
mer 3 feb 2010 - 18:22
sebrerebbe corretto.. sempre che la query abbia anche i campi chiave specificati...
prova a mettere come tipo OdbcType.Image e togliere la valorizzazione di Size, il campo Image ha lunghezza variabile quindi dovrebbe gestirsela lui..
io di solito piuttosto che l'insert per altri motivi andavo a fare un select aggiornabile..
se il campo esisteva mi aggiornavo il dato con il DataRow (datarow["Img_photo"] = campoblob) e poi aggiungevo al DataTable e facevo l'update se invece il campo non esisteva aggiungevo di sana pianta tutta la riga valorizzando anche le chivi del dataRow..
se non riesci con la prima soluzione, prova con questa. ciao
Vincenzo
Programmatore sbilenco
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !