2014-12-12 12 views
7

L'intera domanda è come mostrare l'immagine caricata dal database in Windows Phone 8.1. I dati immagine vengono caricati come array di byte (controllato - carica bene).Carica, mostra, converti immagine da matrice di byte (database) in Windows Phone 8.1

La visualizzazione dell'immagine specificando urisource funziona correttamente.

Image img = new Image(); 
img.Source = new BitmapImage() {UriSource = new Uri("http://www.example.com/1.jpg") }; 
rootgrid.Children.Add(img);  

Ma quando l'array di byte (di immagine) viene convertito in BitmapImage, non viene visualizzato nulla. L'unico esempio eccezione libero I'v trovato finora è:

public BitmapImage ConvertToBitmapImage(byte[] image) 
{ 
    InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream(); 
    var bitmapImage = new BitmapImage(); 
    var memoryStream = new MemoryStream(image); 
    memoryStream.CopyToAsync(ras.AsStreamForWrite()); 
    bitmapImage.SetSourceAsync(ras); 
    return bitmapImage; 
} 

Image img = new Image(); 
img.Source = ConvertToBitmapImage(picturebytearray); 
rootgrid.Children.Add(img); 

ma nessuna immagine viene mostrata poi.

La documentazione di Microsoft contiene solo esempi di caricamento di immagini dal flusso che si ottiene aprendo il file dalla memoria interna. Ma ho bisogno di caricare l'immagine, che viene salvata nel database sqlite. I dati dell'immagine sono in formato jpeg.

Edit: codice di lavoro sulla base di freshbm soluzione:

public async Task<BitmapImage> ConvertToBitmapImage(byte[] image) 
{ 
    BitmapImage bitmapimage = null; 
    using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream()) 
    { 
     using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0))) 
     { 
      writer.WriteBytes((byte[])image); 
      await writer.StoreAsync(); 
     } 
     bitmapimage = new BitmapImage(); 
     bitmapimage.SetSource(ms); 
    } 
    return bitmapimage; 
} 

Poi nei costruttori è possibile utilizzare:

img.Source = ConvertToBitmapImage(imagebytearray).Result; 

oppure

img.Source = await ConvertToBitmapImage(imagebytearray); 

risposta

8

si può provare qualcosa di simile convertire byte [] in BitmapImmagine:

using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream()) 
{    
    using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0))) 
    { 
     writer.WriteBytes((byte[])fileBytes); 
     writer.StoreAsync().GetResults(); 
    } 
    var image = new BitmapImage(); 
    image.SetSource(ms); 
} 

trovato in questo: http://www.codeproject.com/Tips/804423/Conversion-between-File-Byte-Stream-BitmapImage-an

sto usando per leggere byte [] dal database SQLite e associarlo all'Immagine a pagina.

Per il vostro codice di prova ad aggiungere await per le funzioni asincrone:

public async Task<BitmapImage> ConvertToBitmapImage(byte[] image) 
{ 
    InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream(); 
    var bitmapImage = new BitmapImage(); 
    var memoryStream = new MemoryStream(image); 
    await memoryStream.CopyToAsync(ras.AsStreamForWrite()); 
    await bitmapImage.SetSourceAsync(ras); 
    return bitmapImage; 
} 

Image img = new Image(); 
img.Source = await ConvertToBitmapImage(picturebytearray); 
rootgrid.Children.Add(img); 

io non sono bravo a programmazione asincrona, ma penso che questo dovrebbe funzionare.

+0

La soluzione funziona. Ma non perché sia ​​asincrono (cambiare il mio in async non aiuta). Lo uso dal costruttore di classi in cui "attendere" non è consentito. –

Problemi correlati