Question

Je suis un peu de difficulté créer un BitmapImage d'un MemoryStream de png et gif octets obtenus à partir d'une requête Web. Les octets semblent être téléchargé fin et l'objet BitmapImage est créé sans problème mais l'image ne fait le rendu sur mon interface utilisateur. Le problème se produit uniquement lorsque l'image téléchargée est de type PNG ou GIF (fonctionne très bien pour les jpeg).

est le code ici qui illustre le problème:

var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
    Byte[] buffer = new Byte[webResponse.ContentLength];
    stream.Read(buffer, 0, buffer.Length);

    var byteStream = new System.IO.MemoryStream(buffer);

    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.DecodePixelWidth = 30;
    bi.StreamSource = byteStream;
    bi.EndInit();

    byteStream.Close();
    stream.Close();

    return bi;
}

Pour vérifier que la demande Web a été d'obtenir correctement les octets que j'ai essayé les éléments suivants qui enregistre les octets dans un fichier sur le disque et charge ensuite l'image en utilisant un UriSource plutôt que d'un StreamSource et cela fonctionne pour tous les types d'images:

var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
    Byte[] buffer = new Byte[webResponse.ContentLength];
    stream.Read(buffer, 0, buffer.Length);

    string fName = "c:\\" + ((Uri)value).Segments.Last();
    System.IO.File.WriteAllBytes(fName, buffer);

    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.DecodePixelWidth = 30;
    bi.UriSource = new Uri(fName);
    bi.EndInit();

    stream.Close();

    return bi;
}

Quelqu'un at-il une lumière de briller?

Était-ce utile?

La solution

Ajoutez bi.CacheOption = BitmapCacheOption.OnLoad directement après votre .BeginInit():

BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
...

Sans cela, BitmapImage utilise l'initialisation paresseuse par défaut et flux sera fermé alors. Dans premier exemple vous essayez de lire l'image de peut-être ramasse-miettes fermée ou même MemoryStream disposé. Deuxième exemple utilise le fichier, qui est toujours disponible. En outre, ne pas écrire

var byteStream = new System.IO.MemoryStream(buffer);

mieux

using (MemoryStream byteStream = new MemoryStream(buffer))
{
   ...
}

Autres conseils

J'utilise ce code:

public static BitmapImage GetBitmapImage(byte[] imageBytes)
{
   var bitmapImage = new BitmapImage();
   bitmapImage.BeginInit();
   bitmapImage.StreamSource = new MemoryStream(imageBytes);
   bitmapImage.EndInit();
   return bitmapImage;
}

Peut être que vous devez supprimer cette ligne:

bi.DecodePixelWidth = 30;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top