descargar de forma sincrónica una imagen desde una URL
-
01-10-2019 - |
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;
}
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