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);
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. –