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