2010-09-07 74 views
5

我試圖做一個簡單的事情的圖像,但我不能......同步方式從下載網址

我只是想從互聯網網址BitmapImage的,但我的功能似乎並沒有工作正確地說,它只是給我一小部分圖像。我知道WebResponse正在工作異步,這當然是爲什麼我有這個問題,但我怎麼能同步做到這一點?

這裏是我的功能:

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 2010-09-07 14:42:47

+0

從響應流中讀取時,它不會填滿緩衝區,從本地文件讀取時會發生這種情況。所以讀取的字節數量會少於緩衝區的大小。但是它會大於0,表示文件的末尾還沒有到達。我想這是從網址完全讀取圖像失敗的關鍵。 – treaschf 2010-09-07 14:46:10

+0

確定這個示例工作下載圖片,我現在應該能夠將該文件轉換爲BitmapImage。 – Karnalta 2010-09-07 14:53:03

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

的simpliest是

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

則可以更改BitmapCacheOption開始檢索過程。但是,圖像是以異步方式檢索的。但你不應該在意