Visualizzare una immagine memorizzata come byte[]

martedì 02 febbraio 2010 - 18.56

iako17 Profilo | Newbie

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

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

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

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
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 !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5