What and how is the best way to get an image from a URL when using the Compact Framework?
Something I found was this (made a function out of it):
public Bitmap getImageFromUrl()
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(this.SImageUrl);
request.Timeout = 5000; // 5 seconds in milliseconds
request.ReadWriteTime开发者_如何转开发out = 20000; // allow up to 20 seconds to elapse
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream ms = response.GetResponseStream();
Bitmap imageFromUrl;
using (MemoryStream ms2 = new MemoryStream())
{
int bytes = 0;
byte[] temp = new byte[4096];
while ((bytes = ms.Read(temp, 0, temp.Length)) != 0)
ms2.Write(temp, 0, bytes);
imageFromUrl = new Bitmap(ms2);
}
return imageFromUrl;
}
But it won't show any images in the pictureBox. Any ideas?
I now found something that works better, but thanks for an answer Steve Danner. Here is my solution:
public Bitmap getImageFromURL(String sURL)
{
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(sURL);
myRequest.Method = "GET";
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myResponse.GetResponseStream());
myResponse.Close();
return bmp;
}
Since you have a statically declared buffer of length 4096, when it gets to the end of the buffer, this line:
while ((bytes = ms.Read(temp, 0, temp.Length)) != 0)
is trying to read in 4096 bytes, when there are probably substantially less. Change your loop to something like this.
using (MemoryStream ms2 = new MemoryStream())
{
int bytes = 0;
while (true)
{
int byteLen = ms.Length - ms.Position >= 4096 ? 4096 : ms.Length - ms.Position;
byte[] temp = new byte[byteLen];
bytes = ms.Read(temp, 0, byteLen);
ms2.Write(temp, 0, bytes);
imageFromUrl = new Bitmap(ms2);
if (ms.Position == ms.Length) break;
}
精彩评论