Pregunta

Sólo quiero conseguir un BitmapImage de una URL de Internet, pero mi función no parece funcionar correctamente, sólo me devolvió una pequeña parte de la imagen. Sé asíncrono WebResponse está trabajando y eso es sin duda por qué tengo este problema, pero ¿cómo puedo hacerlo de forma sincrónica?

    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;
    }
¿Fue útil?

Solución

En primer lugar se debe sólo tiene que descargar la imagen y almacenarla localmente en un archivo temporal o en una MemoryStream. Y luego crear el objeto BitmapImage de ella.

Se puede descargar la imagen, por ejemplo, así:

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

Otros consejos

¿Por qué no usar 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);

este es el código que utilizo para tomar una imagen desde una 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 );
       }
    }

El más simple es

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

A continuación, puede cambiar BitmapCacheOption para iniciar el proceso de recuperación. Sin embargo, la imagen se recupera en asíncrono. Pero no se debe cuidar mucho

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top