2010-09-07 7 views
5

Je suis en train de faire une chose simple mais je ne peux pas ...Synchrone télécharger une image depuis l'URL

Je veux juste obtenir un BitmapImage à partir d'une URL Internet, mais ma fonction ne semble pas fonctionner correctement, cela ne me rend qu'une petite partie de l'image. Je sais que WebResponse fonctionne en mode asynchrone et c'est certainement la raison pour laquelle j'ai ce problème, mais comment puis-je le faire de manière synchrone?

Voici ma fonction:

internal static BitmapImage GetImageFromUrl(string url) 
    { 
     Uri urlUri = new Uri(url); 
     WebRequest webRequest = WebRequest.CreateDefault(urlUri); 
     webRequest.ContentType = "image/jpeg"; 
     WebResponse webResponse = webRequest.GetResponse(); 

     BitmapImage image = new BitmapImage(); 
     image.BeginInit(); 
     image.StreamSource = webResponse.GetResponseStream(); 
     image.EndInit(); 

     return image; 
    } 

Merci beaucoup pour votre aide.

Répondre

10

Vous devez d'abord télécharger l'image et la stocker localement dans un fichier temporaire ou dans un MemoryStream. Puis créez l'objet BitmapImage à partir de celui-ci.

Vous pouvez télécharger l'image par exemple comme ceci:

Uri urlUri = new Uri(url); 
var request = WebRequest.CreateDefault(urlUri); 

byte[] buffer = new byte[4096]; 

using (var target = new FileStream(targetFileName, FileMode.Create, FileAccess.Write)) 
{ 
    using (var response = request.GetResponse()) 
    {  
     using (var stream = response.GetResponseStream()) 
     { 
      int read; 

      while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       target.Write(buffer, 0, read); 
      } 
     } 
    } 
} 
+0

Je n'ai pas beaucoup de chance avec cela, mon image est encore partiellement téléchargée sur le MemoryStream, peut-être vous pouvez me fournir un exemple de code? – Karnalta

+0

Lors de la lecture du flux de réponse, il ne remplira pas le tampon, comme ce serait le cas lors de la lecture d'un fichier local. Ainsi, la quantité d'octets lus serait inférieure à la taille du tampon. Cependant, il sera supérieur à 0, ce qui indique que la fin du fichier n'a pas encore été atteinte. Je suppose que c'est la clé de l'échec de la lecture de l'image complètement à partir de l'URL. – treaschf

+0

Ok, cet exemple fonctionne pour télécharger l'image, je devrais maintenant être en mesure de convertir ce fichier en BitmapImage. – Karnalta

0

c'est le code que j'utilise pour saisir une image à partir d'une url ....

// get a stream of the image from the webclient 
    using (Stream stream = webClient.OpenRead(imgeUri)) 
    { 
     // make a new bmp using the stream 
     using (Bitmap bitmap = new Bitmap(stream)) 
     { 
      //flush and close the stream 
      stream.Flush(); 
      stream.Close(); 
      // write the bmp out to disk 
      bitmap.Save(saveto); 
     } 
    } 
1

Pourquoi ne pas utiliser System.Net.WebClient.DownloadFile?

string url = @"http://www.google.ru/images/srpr/logo3w.png"; 
string file = System.IO.Path.GetFileName(url); 
System.Net.WebClient cln = new System.Net.WebClient(); 
cln.DownloadFile(url,file); 
-3

Le simple est

Uri pictureUri = new Uri(pictureUrl); 
BitmapImage image = new BitmapImage(pictureUri); 

vous pouvez changer BitmapCacheOption pour démarrer le processus de récupération. Cependant, l'image est récupérée en asynchrone. Mais vous ne devriez pas trop m'inquiéter

Questions connexes