Descargar imagen desde URL C#

Las imágenes son útiles para entender las cosas de manera más clara, rápida y fácil. Por lo tanto, las imágenes se usan comúnmente en la web por muchas razones. A veces es posible que necesite descargar imágenes de diferentes páginas web. En consecuencia, este artículo cubre cómo descargar una imagen desde una URL en C#. También contiene algunos recursos de descarga para que pueda simplemente probar la descarga de imágenes con un tipo de proyecto plug-and-play.

Instalación de la API de C# Web Scraping para descargar la imagen

Aspose.HTML for .NET es una biblioteca C# de web scraping que se puede usar para extraer datos o información de páginas web o archivos HTML. Puede configurar fácilmente la API descargando los archivos DLL de referencia de la sección Nuevas versiones, o usando el siguiente comando de instalación NuGet:

PM> Install-Package Aspose.Html

Descargar imagen desde URL en C#

Puede descargar fácilmente una imagen desde la URL en C# con simples llamadas a la API. Asimismo, puede procesar HTML y otros formatos de páginas web para descargar las imágenes. Puede recopilar todas las imágenes de los elementos IMG u OBJECT del documento de entrada y escribirlas en la carpeta especificada con nombres únicos. Además, admite guardar imágenes PNG, JPG y SVG. Siga los pasos a continuación para descargar imágenes de la URL en C#:

  • Cree una clase de imagen para trabajar con URL, MimeType y contenido.
  • Obtenga la imagen del elemento IMG u OBJECT.
  • Escriba la imagen en el disco utilizando la clase ImageSaver.

Los siguientes ejemplos de código demuestran todo el proceso para descargar la imagen mediante programación en C#:

namespace DownloadImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // Puede obtener una licencia de evaluación GRATUITA en https://purchase.aspose.com/temporary-license
            Aspose.Html.License license = new License();
            license.SetLicense("License.lic");

            // Establecer ruta para leer o escribir datos en el disco
            string dataDir = @"D:\Image Web Scraping\";

            // Especifique la ruta para leer el archivo de entrada desde el disco local
            //usando var doc = new HTMLDocument(dataDir + "Sample.html");

            // Especifique la URL para descargar la imagen desde la URL en C#
            using var doc = new HTMLDocument("YOUR URL GOES HERE");            
            var grabber = new ImageGrabber();
            var saver = new ImageSaver(dataDir);
            saver.Save(grabber.GrabFrom(doc));
        }
    }
}
namespace DownloadImage
{
    public class Image
    {
        public Image(ResponseMessage response)
        {
            Content = response.Content.ReadAsByteArray();
            Url = response.Request.RequestUri;
            MimeType = response.Headers.ContentType.MediaType;
        }

        public Url Url { get; }
        public MimeType MimeType { get; }
        public byte[] Content { get; }
    }
}
namespace DownloadImage
{
    class ImageGrabber
    {
        private readonly IList<IElementGrabber> _elementGrabbers = new List<IElementGrabber>();

        public ImageGrabber()
        {
            _elementGrabbers.Add(new ImgElementGrabber());
            _elementGrabbers.Add(new ObjectElementGrabber());
        }

        public IEnumerable<Image> GrabFrom(Document document)
        {
            return _elementGrabbers.SelectMany(collector => collector.Collect(document));
        }

        private interface IElementGrabber
        {
            public IEnumerable<Image> Collect(Document document);
        }

        private class ImgElementGrabber : IElementGrabber
        {
            public IEnumerable<Image> Collect(Document document)
            {
                var images = document.QuerySelectorAll("img");

                foreach (Element image in images)
                {
                    if (!image.HasAttribute("src")) continue;
                    var src = image.GetAttribute("src");
                    using var response = document.Context.Network.Send(new RequestMessage(new Url(src, document.BaseURI)));

                    if (response.IsSuccess)
                    {
                        yield return new Image(response);
                    }
                }
            }
        }

        private class ObjectElementGrabber : IElementGrabber
        {
            public IEnumerable<Image> Collect(Document document)
            {
                var objects = document.QuerySelectorAll("object");

                foreach (Element obj in objects)
                {
                    if (!obj.HasAttribute("data")) continue;
                    var data = obj.GetAttribute("data");
                    using var response = document.Context.Network.Send(new RequestMessage(new Url(data, document.BaseURI)));

                    if (response.Headers.ContentType.MediaType.Type.StartsWith("image") && response.IsSuccess)
                    {
                        yield return new Image(response);
                    }
                }
            }
        }
    }
}
namespace DownloadImage
{
    public class ImageSaver
    {
        private readonly string _folderPath;

        public ImageSaver(string folderPath)
        {
            _folderPath = folderPath;
        }

        public void Save(IEnumerable<Image> images)
        {
            foreach (var image in images)
            {
                Save(image);
            }
        }

        public void Save(Image image)
        {
            if (!Directory.Exists(_folderPath)) Directory.CreateDirectory(_folderPath);

            var fileName = Path.GetFileNameWithoutExtension(image.Url.Pathname);
            var extension = Path.GetExtension(image.Url.Pathname);

            if (string.IsNullOrEmpty(extension))
            {
                extension = image.MimeType.Type switch
                {
                    "image/jpeg" => ".jpeg",
                    "image/png" => ".png",
                    "image/svg+xml" => ".svg",
                    _ => ".png"
                };
            }

            if (string.IsNullOrEmpty(fileName))
            {
                fileName = "image";
            }

            var i = 0;
            var fileNameWithExtension = fileName + extension;
            string savedImagePath;

            while (File.Exists(savedImagePath = Path.Combine(_folderPath, fileNameWithExtension)))
            {
                fileNameWithExtension = $"{fileName} ({i++}){extension}";
            }

            File.WriteAllBytes(savedImagePath, image.Content);
        }
    }
}

Descargar un proyecto de muestra de trabajo

Puede encontrar una aplicación de demostración de C# plug-and-play clonando el proyecto de muestra en funcionamiento desde el Repositorio de GitHub o accediendo a él como un archivo ZIP desde Google Drive.

Obtenga una licencia de evaluación gratuita

Puede evitar las restricciones de limitación de evaluación solicitando una licencia temporal gratuita.

Conclusión

En este artículo, ha aprendido cómo descargar una imagen desde una URL o en C#. Del mismo modo, puede descargar imágenes de una página HTML según sus requisitos porque la API puede resolver las rutas relativas a las imágenes. Le permite guardar las imágenes en formato JPG, PNG o SVG con nombres únicos. Además, puede explorar otras funciones de web scraping visitando la sección documentación. En caso de que necesite discutir cualquier consulta o inquietud, escríbanos al foro.

Ver también

Cree un Web Scraper en C#