web-dev-qa-db-fra.com

convertir un tableau d'octets en image bitmap

Je vais convertir un tableau d'octets en System.Windows.Media.Imaging.BitmapImage et affichez le BitmapImage dans un contrôle d'image.

Lorsque j'utilise le premier code, notant arrive! aucune erreur et aucune image ne s'affiche. Mais quand j'utilise le second, ça marche bien! quelqu'un peut-il dire ce qui se passe?

le premier code est ici:

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;
   }
}

le deuxième code est ici:

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

Dans le premier exemple de code, le flux est fermé (en laissant le bloc using) avant que l'image ne soit réellement chargée. Vous devez également définir BitmapCacheOptions.OnLoad pour que l'image soit chargée immédiatement, sinon le flux doit rester ouvert, comme dans votre deuxième exemple.

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;
    }
}

Dans la section Remarques de BitmapImage.StreamSource :

Définissez la propriété CacheOption sur BitmapCacheOption.OnLoad si vous souhaitez fermer le flux après la création de BitmapImage.


En plus de cela, vous pouvez également utiliser la conversion de type intégrée pour convertir à partir du type byte[] pour taper ImageSource (ou le dérivé BitmapSource):

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

ImageSourceConverter est appelé implicitement lorsque vous liez une propriété de type ImageSource (par exemple, la propriété Source du contrôle Image) à une propriété source de type string, Uri ou byte[].

56
Clemens

Dans le premier cas, vous avez défini votre MemoryStream dans un bloc using, ce qui provoque la suppression de l'objet lorsque vous sortez du bloc. Vous retournez donc un BitmapImage avec un flux de suppression (et non existant).

MemoryStreams ne conserve aucune ressource non gérée, vous pouvez donc laisser la mémoire et laisser le GC gérer le processus de libération (mais ce n'est pas une bonne pratique).

4
Mohammad Dehghan