2010-08-04 53 views
4

我想讀網站上的PNG文件的原始二進制並將其存儲到一個byte [],到目前爲止,我有這樣的事情:使用的HttpWebRequest從網站獲得的圖像爲byte []

  Uri imageUri = new Uri("http://www.example.com/image.png"); 
      // Create a HttpWebrequest object to the desired URL. 
      HttpWebRequest imgRequest = (HttpWebRequest)WebRequest.Create(imageUri); 
       using (HttpWebResponse imgResponse = (HttpWebResponse)imgRequest.GetResponse()) 
      { 
       using (BinaryReader lxBR = new BinaryReader(imgResponse.GetResponseStream())) 
       { 
        using (MemoryStream lxMS = new MemoryStream()) 
        { 
         lnBuffer = lxBR.ReadBytes(1024); 
         while (lnBuffer.Length > 0) 
         { 
          lxMS.Write(lnBuffer, 0, lnBuffer.Length); 
          lnBuffer = lxBR.ReadBytes(1024); 
         } 
         lnFile = new byte[(int)lxMS.Length]; 
         lxMS.Position = 0; 
         lxMS.Read(lnFile, 0, lnFile.Length); 
        } 
       } 
      } 

但我不能在Silverlight上使用GetResponse,因爲它不是異步的(我認爲這是原因),所以我應該使用BeginGetResponse,但我不完全清楚如何去解決這個問題。這是我到目前爲止有:

   HttpWebResponse imgResponse = (HttpWebResponse)imgRequest.BeginGetResponse(new AsyncCallback(WebComplete), imgRequest); 

      using (imgResponse) 
      { 
       using (BinaryReader lxBR = new BinaryReader(imgResponse.GetResponseStream())) 
       { 
        /*Same*/ 
       } 
      } 

 void WebComplete(IAsyncResult a) 
    { 
     HttpWebRequest req = (HttpWebRequest)a.AsyncState; 
     HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(a); 
     //...? Do I need something else here? 
    } 

有人可以解釋我一點點如何使用BeginGetResponse財產,我怎麼使用的AsyncCallback。 謝謝!

注: 我是新來的Silverlight和我一直跟隨在計算器上的教程和借款從這裏其他的反應: (stackoverflow responce) what I need to do but not in silverlight

tutorial

WebRequest_in_Silverlight

這是有效的Silverlight代碼?

HttpWebResponse imgResponse = (HttpWebResponse)imgRequest.BeginGetResponse(new AsyncCallback(WebComplete), imgRequest); 
+0

爲什麼存儲流?一旦擁有它,你會怎麼做? – AnthonyWJones 2010-08-04 16:57:11

+0

我只需要圖像的字節來修改它們,然後從它們中創建一個BitmapImage。如果內存流不簡化我的工作,那麼我不會使用它(說實話,我不知道什麼是內存流) – david 2010-08-04 18:07:31

回答

4

得到它的工作,想在這裏發佈它,以防萬一需要它。

我需要得到這個圖像,然後修改它(字節級別)Silverlight不讓我保存圖像直接到WriteableBitmap,因此我必須得到一個WebClient作爲一個流的圖像,然後將其保存到一個byte[]

這是我得到的圖像(我已經有具體的URI):

WebClient wc = new WebClient(); 
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted); 
wc.OpenReadAsync(uri) 

所以當圖像加載wc_OpenReadCompleted方法被調用,它確實是這樣的:

int lengthInBytes = Convert.ToInt32(e.Result.Length); 
BinaryReader br = new BinaryReader(e.Result); 

byte[] buffer = new byte[lengthInBytes]; 
using (br) 
{ 
    for (int i = 0; i < lengthInBytes; i++) 
    { 
     buffer[i] = br.ReadByte(); 
    } 
} 

末的buffer[]具有圖像的所有字節(我想要) 我敢肯定有,但這樣做的更好的方法,這是爲我工作! )

注:在某些時候,我需要的字節[]轉換爲BitmapImage的(這是比較容易比預期的):

 //imageInBytes is a byte[] 

     if (imageInBytes != null) 
     { 
      MemoryStream rawBytesStream = new MemoryStream(imageInBytes); 
      BitmapImage img = new BitmapImage(); 
      img.SetSource(rawBytesStream); 
      return img; 
     } 

我希望這可以幫助任何人。

+0

哦,如果有人有任何建議,請張貼它們! – david 2010-08-06 21:30:36

+0

感謝您的支持 - 爲我工作得很好。一個小的變化,可能更有效:'buffer = br.ReadBytes(lengthInBytes);'而不是在循環中一次讀取一個字節 – 2013-01-31 19:56:10

1

使用WebClient對象的OpenReadAsync方法。附加到WebClientOpenReadCompleted事件中。使用事件參數的Result屬性提供的Stream

考慮設置AllowReadStreamBuffering,這會在提高OpenReadCompleted之前填滿整個流。無論哪種情況,您都可以使用此流來完成您真正的任務,而不是將其應用到MemoryStream中。

+0

所以使用WebClient而不是HttpWebRequest?那麼我會做一些研究。謝謝 – david 2010-08-04 18:09:04

+0

好吧,它看起來像我不能使用HttpWebRequest反正HttpWebRequest.BeginGetResponse()給我一個運行時錯誤 – david 2010-08-04 18:17:58

+1

@david:你可以在Silverlight中使用HttpWebRequest(內部多數民衆贊成什麼WebClient使用),但WebClient在很多情況下更簡單。 – AnthonyWJones 2010-08-05 07:58:26