PNGBITMAPDECODER Stream Domanda
-
28-10-2019 - |
Domanda
Non so molto sui flussi. Perché la prima versione funziona usando un file ma la seconda no? Mettere un punto di interruzione su "Return Dest;" Sembra che entrambi abbiano creato esattamente la stessa cosa, ma Dest è sempre un'immagine vuota usando la seconda versione.
public static BitmapSource ConvertByteArrayToBitmapSource(Byte[] imageBytes, ImageFormat formatOfImage)
{
BitmapSource dest = null;
if (formatOfImage == ImageFormat.Png)
{
var streamOut = new FileStream("tmp.png", FileMode.Create);
streamOut.Write(imageBytes, 0, imageBytes.Length);
streamOut.Close();
Uri myUri = new Uri("tmp.png", UriKind.RelativeOrAbsolute);
var bdecoder2 = new PngBitmapDecoder(myUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
dest = bdecoder2.Frames[0];
}
return dest;
}
public static BitmapSource ConvertByteArrayToBitmapSource_NoWork(Byte[] imageBytes, ImageFormat formatOfImage)
{
BitmapSource dest = null;
using (var stream = new MemoryStream(imageBytes))
{
var bdecoder = new PngBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
stream.Flush();
dest = bdecoder.Frames[0];
stream.Close();
}
return dest;
}
Soluzione
Devi specificare BitmapCacheOption.OnLoad
Poiché la bitmap verrà altrimenti caricata quando viene visualizzata per la prima volta. Quindi, tuttavia, il flusso è già disposto.
Inoltre, guarda questa versione a supporto di diversi formati di immagini e congelando l'immagine per prestazioni migliori:
public static BitmapSource ConvertByteArrayToBitmapSource(Byte[] imageBytes)
{
using (MemoryStream stream = new MemoryStream(imageBytes))
{
BitmapDecoder deconder = BitmapDecoder.Create(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
BitmapFrame frame = deconder.Frames.First();
frame.Freeze();
return frame;
}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow