Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

WPF: Convertire una BitmapImage in un array di byte, con Extension method

In Windows Presentation Foundation abbiamo a disposizione una classe chiamata BitmapImage (namespace System.Windows.Media.Imaging), che ci permette di creare o caricare immagini anche a run-time, sebbene sia ottiumizzata per l'utilizzo di immagini nello XAML.

La mia necessità era quella di scrivere, tramite ADO.NET Entity Framework, un'immagine rappresentata da una BitmapImage all'interno di un database le cui tabelle sono mappate tramite la predetta infrastruttura, che riceve l'immagine sotto forma di array di byte. 

Cercando in Internet ho trovato diverse soluzioni (in C#, chiaro) che espongono un metodo custom per realizzare l'obiettivo. Oltre a ristrutturare il tutto in chiave Visual Basic 2008, ho pensato di creare un metodo Extension per la classe BitmapImage, al fine di illustrarvi un'altra interessante possibilità.

Partiamo innanzitutto dalla nostra BitmapImage. Il seguente snippet ne istanzia una e le assegna un file esistente, come indicato nei commenti che vi invito ad attenzionare:

        'Istanzia l'immagine

        Dim photo As New BitmapImage

 

        'Avvia la fase di modifica e assegnazione proprietà

        photo.BeginInit()

 

        'UriSource stabilisce il percorso del file esistente

        'sotto forma di Uri

        photo.UriSource = New Uri("Foto.jpg", UriKind.Relative)

 

        'StreamSource stabilisce l'origine del file sotto forma di stream.

        photo.StreamSource = New IO.FileStream("Foto.jpg", IO.FileMode.Open)

 

        'Fine fase modifica

        photo.EndInit()

Ora, dobbiamo scrivere un metodo che esegua la conversione in un tipo System.Byte(). Come detto, piuttosto che scrivere un metodo all'interno di una classe come siamo abituati a fare, possiamo sfruttare l'interessante feature introdotta da .NET Framework 3.5 costituita dagli Extension method che, come potete facilmente intuire, trovano molte altre destinazioni diverse da LINQ, sebbene siano stati progettati per quest'ultima tecnologia.

Ricordando che gli extension method personalizzati devono risiedere per forza di cose in un modulo (decorato con l'attributo <Extension>) e che devono ricevere come argomento il tipo di dato che vanno ad estendere, possiamo fare un lavoro di questo tipo:

Imports System.Runtime.CompilerServices

....

....

<Extension()> Module Module1

 

    ''' <summary>

    ''' Converts a BitmapImage into a System.Byte() array

    ''' </summary>

    ''' <param name="imageSource"></param>

    ''' <returns></returns>

    ''' <remarks></remarks>

    <Extension()> Function ConvertBitmapImageToBytes(ByVal imageSource As BitmapImage) As Byte()

        'Ottiene sotto forma di stream l'oggetto assegnato come

        'StreamSource alla BitmapImage

        Dim imageStream As IO.Stream = imageSource.StreamSource

 

        'Dichiara un array di byte

        Dim buffer As Byte() = Nothing

 

        'Se lo stream non è vuoto..

        If imageStream IsNot Nothing And imageStream.Length > 0 Then

 

            '..tramite Using..End Using assicura l'accesso alla risorsa

            'solo da parte della nostra applicazione

            Using imageReader As New IO.BinaryReader(imageStream)  'Legge lo stream in forma binaria

 

                'Recupera tanti byte quanto lungo è lo stream

                buffer = imageReader.ReadBytes(Convert.ToInt32(imageStream.Length))

            End Using

        End If

 

        'restituisce l'array di byte

        Return buffer

    End Function

 

End Module

Ho inserito commenti specifici nel codice in modo da rendere più fluida la lettura. La "finezza" dei commenti Xml ci permette di visualizzare una tooltip descrittiva del metodo all'interno dell'Intellisense, quando andremo a richiamarlo. Infine, il nostro nuovo metodo può essere poi utilizzato così, come metodo di istanza dell'oggetto BitmapImage:

Dim MyArray As Byte() = photo.ConvertBitmapImageToBytes

Come sempre, spero che questo post sia stato utile.

Alessandro

Print | posted on sabato 13 settembre 2008 20:15 | Filed Under [ Visual Basic Windows Presentation Foundation ]

Powered by:
Powered By Subtext Powered By ASP.NET