convertir matriz de bytes a imagen de bitmap

Voy a convertir un conjunto de bytes a System.Windows.Media.Imaging.BitmapImage y mostrar el BitmapImage en un control de imagen.

Cuando estoy usando el primer código, ¡observa que sucede! no hay error y no se muestra ninguna imagen. ¡Pero cuando uso el segundo, funciona bien! ¿Alguien puede decir lo que está pasando?

primer código está aquí:

 public BitmapImage ToImage(byte[] array) { using (System.IO.MemoryStream ms = new System.IO.MemoryStream(array)) { BitmapImage image = new BitmapImage(); image.BeginInit(); image.StreamSource = ms; image.EndInit(); return image; } } 

el segundo código está aquí:

 public BitmapImage ToImage(byte[] array) { BitmapImage image = new BitmapImage(); image.BeginInit(); image.StreamSource = new System.IO.MemoryStream(array); image.EndInit(); return image; } 

En el primer ejemplo de código, la transmisión se cierra (dejando el bloque que using ) antes de que la imagen se cargue realmente. También debe establecer BitmapCacheOptions.OnLoad para lograr que la imagen se cargue de inmediato, de lo contrario la secuencia debe mantenerse abierta, como en el segundo ejemplo.

 public BitmapImage ToImage(byte[] array) { using (var ms = new System.IO.MemoryStream(array)) { var image = new BitmapImage(); image.BeginInit(); image.CacheOption = BitmapCacheOption.OnLoad; // here image.StreamSource = ms; image.EndInit(); return image; } } 

Desde la sección Observaciones en BitmapImage.StreamSource :

Establezca la propiedad CacheOption en BitmapCacheOption.OnLoad si desea cerrar la secuencia después de crear BitmapImage.


Además de eso, también puede usar la conversión de tipo incorporada para convertir de tipo byte[] a tipo ImageSource (o el BitmapSource derivado):

 var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(array); 

ImageSourceConverter se invoca implícitamente cuando se vincula una propiedad de tipo ImageSource (por ejemplo, la propiedad Source del control de imagen) a una propiedad source de tipo string , Uri o byte[] .

En el primer caso, definió su MemoryStream en un bloque de using , que hace que el objeto se elimine cuando salga del bloque. De modo que devuelve un BitmapImage con una secuencia de eliminación (y no existente).

MemoryStream s no mantiene recursos no administrados, por lo que puede dejar la memoria y dejar que el GC maneje el proceso de liberación (pero esa no es una buena práctica).