2010-09-07 6 views
5

Я пытаюсь сделать простую вещь, но я не могу ...Синхронно загрузить изображение из URL

Я просто хочу, чтобы получить BitmapImage из Интернета URL, но моя функция, кажется, не работает правильно, он возвращает мне лишь небольшую часть изображения. Я знаю, что WebResponse работают async, и это, конечно, почему у меня есть эта проблема, но как я могу сделать это синхронно?

Вот моя функция:

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

Спасибо большое за вашу помощь.

ответ

10

Сначала вы должны просто загрузить изображение и сохранить его локально во временном файле или в MemoryStream. Затем создайте объект BitmapImage.

Вы можете загрузить изображение, например, как это:

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

Мне не очень повезло, мое изображение по-прежнему частично загружено в MemoryStream, может быть, вы можете предоставить мне пример кода? – Karnalta

+0

При чтении из потока ответов он не заполняет буфер, как это было бы при чтении из локального файла. Таким образом, количество прочитанных байтов будет меньше, чем размер буфера. Однако оно будет больше 0, что указывает, что конец файла еще не достигнут. Я полагаю, что это ключ к отказу от чтения изображения полностью из URL-адреса. – treaschf

+0

Хорошо, этот образец работы для загрузки изображения, теперь я должен был бы преобразовать этот файл в BitmapImage. – Karnalta

0

это код я использую, чтобы захватить изображение из 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

Почему бы не использовать 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

Простейший является

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

, то вы можете изменить BitmapCacheOption, чтобы начать процесс извлечения. Однако изображение извлекается в async. Но вам не все равно