VB.NET: Creazione di un oggetto Image da un array di bytes
Per creare un oggetto System.Drawing.Image a partire da un array di bytes, ad esempio nel caso si sia memorizzata in formato binario un’immagine in database o in file Xml, è possibile creare un oggetto System.IO.MemoryStream dall’array di bytes e poi usare il metodo Shared FromStream della classe System.Drawing.Image.
Occorre però tenere presente che lo stream deve rimanere aperto per tutta la durata dell’oggetto System.Drawing.Image creato come rimportato nella documentazione del metodo FromStream:
“You must keep the stream open for the lifetime of the Image.
The stream is reset to zero if this method is called successively with the same stream.”
Per disaccopiare lo stream dall’oggetto System.Drawing.Image creato è possibile utilizzare un oggetto System.Drawing.Image temporaneo da cui creare un secondo oggetto System.Drawing.Image.
Di seguito un esempio di un funzione in VB.Net che crea un oggetto System.Drawing.Image a partire da un array di bytes:
Public Function CreateImageFromBytes(ByVal bytes As Byte()) As System.Drawing.Image
If bytes Is Nothing Then Return Nothing
Using stream As New System.IO.MemoryStream(bytes)
Using tmpImage = System.Drawing.Image.FromStream(stream)
CreateImageFromBytes = New System.Drawing.Bitmap(tmpImage)
End Using
End Using
End Function
Questo approccio permette anche di evitare di tenere bloccato un file immagine (.png, jpg, tec.) da cui si desidera creare un oggetto System.Drawing.Image.
Di seguito un esempio di un funzione in VB.Net che crea un oggetto System.Drawing.Image a partire da dal path di un file immagine:
Public Function CreateImageFromFile(ByVal filePath As String) As System.Drawing.Image
If String.IsNullOrEmpty(filePath) Then Return Nothing
If Not System.IO.File.Exists(filePath) Then Return Nothing
Using stream As New System.IO.FileStream(filePath, IO.FileMode.Open, IO.FileAccess.Read)
Using tmpImage = System.Drawing.Image.FromStream(stream)
CreateImageFromFile = New System.Drawing.Bitmap(tmpImage)
End Using
End Using
End Function