Scarica immagine dall'URL C#

Gli elementi visivi sono utili per capire le cose in modo più chiaro, più veloce e più facile. Pertanto, le immagini sono comunemente utilizzate sul Web per molte ragioni. A volte potrebbe essere necessario scaricare immagini da diverse pagine web. Di conseguenza, questo articolo illustra come scaricare l’immagine dall’URL in C#. Contiene anche alcune risorse di download in modo da poter testare semplicemente il download di immagini con un tipo di progetto plug-and-play.

Installazione dell’API C# Web Scraping per scaricare l’immagine

Aspose.HTML for .NET è una libreria C# di scraping Web che può essere utilizzata per estrarre dati o informazioni da pagine Web o file HTML. È possibile configurare facilmente l’API scaricando i file DLL di riferimento dalla sezione Nuove versioni o utilizzando il seguente comando di installazione NuGet:

PM> Install-Package Aspose.Html

Scarica immagine dall’URL in C#

Puoi facilmente scaricare l’immagine dall’URL in C# con semplici chiamate API. Allo stesso modo, puoi elaborare HTML e altri formati di pagine Web per scaricare le immagini. Puoi raccogliere tutte le immagini dagli elementi IMG o OBJECT dal documento di input e scriverle nella cartella specificata con nomi univoci. Inoltre, supporta il salvataggio di immagini PNG, JPG e SVG. Segui i passaggi seguenti per scaricare le immagini dall’URL in C#:

  • Crea una classe Image per lavorare con URL, MimeType e Content.
  • Recupera l’immagine dall’elemento IMG o OBJECT.
  • Scrivi l’immagine sul disco usando la classe ImageSaver.

Gli esempi di codice seguenti illustrano l’intero processo per scaricare l’immagine a livello di codice in C#:

namespace DownloadImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // Puoi ottenere una licenza di valutazione GRATUITA su https://purchase.aspose.com/temporary-license
            Aspose.Html.License license = new License();
            license.SetLicense("License.lic");

            // Imposta il percorso per leggere o scrivere i dati sul disco
            string dataDir = @"D:\Image Web Scraping\";

            // Specificare il percorso per leggere il file di input dal disco locale
            //usando var doc = new HTMLDocument(dataDir + "Sample.html");

            // Specifica l'URL per scaricare l'immagine dall'URL in 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);
        }
    }
}

Scarica un progetto di esempio funzionante

Puoi trovare un’applicazione demo C# plug-and-play clonando il progetto di esempio funzionante da GitHub Repository o accedendovi come file ZIP da Google Drive.

Ottieni una licenza di valutazione gratuita

Puoi evitare le limitazioni alla valutazione richiedendo una licenza temporanea gratuita.

Conclusione

In questo articolo, hai imparato come scaricare l’immagine dall’URL o in C#. Allo stesso modo, puoi scaricare immagini da una pagina HTML secondo le tue esigenze perché l’API può risolvere i percorsi relativi alle immagini. Ti consente di salvare le immagini in formato JPG, PNG o SVG con nomi univoci. Inoltre, puoi esplorare altre funzionalità di scraping web visitando la sezione documentazione. Se hai bisogno di discutere qualsiasi domanda o dubbio, scrivici al forum.

Guarda anche

Crea un Web Scraper in C#