Synchronously download an image from URL

11,232

Solution 1

First you should just download the image, and store it locally in a temporary file or in a MemoryStream. And then create the BitmapImage object from it.

You can download the image for example like this:

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

Solution 2

Why not use 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);
Share:
11,232

Related videos on Youtube

Karnalta
Author by

Karnalta

Updated on June 04, 2022

Comments

  • Karnalta
    Karnalta almost 2 years

    I just want to get a BitmapImage from a internet URL, but my function doesn't seem to work properly, it only return me a small part of the image. I know WebResponse is working async and that's certainly why I have this problem, but how can I do it synchronously?

        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;
        }
    
  • Karnalta
    Karnalta over 13 years
    I don't have much luck with it, my image is still partially downloaded to the MemoryStream, maybe you can provide me a sample code ?
  • treaschf
    treaschf over 13 years
    When reading from the response stream, it won't fill up the buffer, as would be the case when reading from a local file. So the amount of bytes read would be less, than the size of the buffer. However it will be greater than 0, which indicates, that the end of the file has not yet been reached. I suppose this is the key of the failure of reading the image completely from the url.
  • Karnalta
    Karnalta over 13 years
    Ok this sample work to download the picture, I should now be able to convert that file into BitmapImage.