Sto lavorando su un'app di Windows 8 Metro che applica i filtri alle immagini. Ho una versione web dell'app e ho voluto portarla. Ma come tutti sappiamo, WinRT non ha tutte le cose buone che .NET fornisce altrimenti:/C# Windows 8 Store (Metro, WinRT) Byte array a BitmapImage
Attualmente sto applicando i filtri su un array di byte e voglio mantenerlo in questo modo, perché è super veloce! Quindi negli ultimi giorni ho cercato modi per convertire uno StorageFile in byte [] e poi byte [] in BitmapImage.
Finora sono riuscito a eseguire il primo (StorageFile su byte []). Ecco come lo faccio:
public async Task<Byte[]> ImageFileToByteArray(StorageFile file)
{
IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
return pixelData.DetachPixelData();
}
Questo pezzo di codice restituisce un byte[]
che contiene i dati dei pixel come BGRA.
E qui arriva la parte difficile. Non riesco a convertire correttamente l'array di byte in un BitmapImage. Ho cercato dappertutto e molte persone suggeriscono di usare WriteableBitmap ma questo non mi fa molto bene. Ho anche trovato alcuni pezzi di codice che dovrebbero funzionare ... ma non lo fanno.
Una delle soluzioni che ho provato sta usando InMemoryRandomAccessStream simili:
public async Task<BitmapImage> ByteArrayToBitmapImage(Byte[] pixels)
{
var stream = new InMemoryRandomAccessStream();
await stream.WriteAsync(pixels.AsBuffer());
stream.Seek(0);
var image = new BitmapImage();
await image.SetSourceAsync(stream);
return image;
}
Questo genera la seguente eccezione:
Un'eccezione di tipo 'System.Exception' avvenuta in mscorlib. dll, ma non è stato gestito nel codice utente
Ulteriori informazioni: Impossibile trovare il componente. (Eccezione da HRESULT: 0x88982F50)
Ho provato ad utilizzare questa linea invece:
PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
new BitmapTransform(),
ExifOrientationMode.IgnoreExifOrientation,
ColorManagementMode.DoNotColorManage);
Ma mi ha fatto non va bene in quanto continuo a ricevere tale eccezione.
Inoltre ho provato questo:
var bitmapImage = new BitmapImage();
var pixels = await ImageFileToByteArray(file);
ImageSource imgSource;
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{
using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
{
writer.WriteBytes(pixels);
await writer.StoreAsync();
}
await bitmapImage.SetSourceAsync(ms);
imgSource = bitmapImage;
}
E ottenere la stessa eccezione come il primo pezzo di codice.
Ho anche provato diversi altri modi che includono l'utilizzo di un flusso normale, quindi la conversione in IRandomAccessStream ma non hanno funzionato neanche.
Tutto il codice sopra mi sembra soddisfacente. Quindi la mia ipotesi al momento è che il problema sia nello byte[]
. Immagino che il formato del pixelData all'interno non sia valido, quindi ho provato a cambiarlo in RGBA, ma non è stato d'aiuto neanche io. Anche il PixelHeight e PixelWidth del BitmapImage sono 0.
Hai trovato una soluzione a questo? Sto anche avendo lo stesso problema. – TheQuestioner