2010-09-07 7 views
5

Tôi đang cố gắng làm một điều đơn giản nhưng tôi không thể ...Đồng bộ tải xuống hình ảnh từ URL

Tôi chỉ muốn lấy BitmapImage từ URL internet, nhưng chức năng của tôi dường như không hoạt động đúng, nó chỉ trả lại cho tôi một phần nhỏ của hình ảnh. Tôi biết WebResponse đang hoạt động không đồng bộ và đó chắc chắn là lý do tại sao tôi có vấn đề này, nhưng làm cách nào tôi có thể thực hiện nó một cách đồng bộ?

Đây là chức năng của tôi:

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

Cảm ơn rất nhiều sự giúp đỡ của bạn.

Trả lời

10

Trước tiên, bạn chỉ cần tải xuống hình ảnh và lưu trữ hình ảnh cục bộ trong một tệp tạm thời hoặc trong một MemoryStream. Và sau đó tạo đối tượng BitmapImage từ nó.

Bạn có thể tải hình ảnh ví dụ như thế này:

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

Tôi không có nhiều may mắn với nó, hình ảnh của tôi vẫn được tải xuống một phần vào MemoryStream, có lẽ bạn có thể cung cấp cho tôi mã mẫu? – Karnalta

+0

Khi đọc từ luồng phản hồi, nó sẽ không lấp đầy bộ đệm, như trường hợp khi đọc từ một tệp cục bộ. Vì vậy, số lượng byte đọc sẽ nhỏ hơn kích thước của bộ đệm. Tuy nhiên nó sẽ lớn hơn 0, cho biết rằng chưa kết thúc tệp. Tôi cho rằng đây là chìa khóa của sự thất bại khi đọc hình ảnh hoàn toàn từ url. – treaschf

+0

Ok tác phẩm mẫu này để tải xuống hình ảnh, bây giờ tôi có thể chuyển đổi tệp đó thành BitmapImage. – Karnalta

0

này được mã tôi sử dụng để lấy một hình ảnh từ một 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

Tại sao không sử dụng 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

Các đơn giản nhất là

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

sau đó bạn có thể thay đổi BitmapCacheOption để bắt đầu quá trình phục hồi. Tuy nhiên, hình ảnh được truy xuất trong async. Nhưng bạn không nên quan tâm nhiều