2010-09-07 68 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开始检索过程。但是,图像是以异步方式检索的。但你不应该在意