Baixar imagem do URL C#

Os recursos visuais são úteis para entender as coisas de forma mais clara, rápida e fácil. Assim, as imagens são comumente usadas na web por vários motivos. Às vezes, você pode precisar baixar imagens de diferentes páginas da web. Da mesma forma, este artigo aborda como baixar a imagem da URL em C#. Ele também contém alguns recursos de download para que você possa simplesmente testar o download de imagens com um tipo de projeto plug-and-play.

Instalação da API C# Web Scraping para baixar a imagem

Aspose.HTML for .NET é uma biblioteca C# de raspagem da Web que pode ser usada para extrair dados ou informações de páginas da Web ou arquivos HTML. Você pode configurar facilmente a API baixando os arquivos DLL de referência da seção New Releases ou usando o seguinte comando de instalação NuGet:

PM> Install-Package Aspose.Html

Baixar imagem do URL em C#

Você pode baixar facilmente a imagem do URL em C# com chamadas de API simples. Da mesma forma, você pode processar HTML e outros formatos de página da Web para baixar as imagens. Você pode coletar todas as imagens dos elementos IMG ou OBJECT do documento de entrada e gravá-las na pasta especificada com nomes exclusivos. Além disso, ele suporta salvar imagens PNG, JPG e SVG. Por favor, siga os passos abaixo para baixar imagens do URL em C#:

  • Crie uma classe Image para trabalhar com URL, MimeType e Content.
  • Busque a imagem do elemento IMG ou OBJECT.
  • Grave a imagem no disco usando a classe ImageSaver.

Os exemplos de código a seguir demonstram todo o processo para baixar a imagem programaticamente em C#:

namespace DownloadImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // Você pode obter uma Licença de Avaliação GRATUITA em https://purchase.aspose.com/temporary-license
            Aspose.Html.License license = new License();
            license.SetLicense("License.lic");

            // Definir caminho para ler ou gravar dados no disco
            string dataDir = @"D:\Image Web Scraping\";

            // Especifique o caminho para ler o arquivo de entrada do disco local
            //usando var doc = new HTMLDocument(dataDir + "Sample.html");

            // Especifique a URL para baixar a imagem da URL em 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);
        }
    }
}

Baixe um projeto de exemplo de trabalho

Você pode encontrar um aplicativo de demonstração C# plug-and-play clonando o projeto de exemplo de trabalho do GitHub Repository ou acessando-o como um arquivo ZIP do Google Drive.

Obtenha uma licença de avaliação gratuita

Você pode evitar as restrições de limitação de avaliação solicitando uma licença temporária gratuita.

Conclusão

Neste artigo, você aprendeu como baixar imagens de URL ou em C#. Da mesma forma, você pode baixar imagens de uma página HTML de acordo com seus requisitos, pois a API pode resolver os caminhos relativos às imagens. Ele permite que você salve as imagens no formato JPG, PNG ou SVG com nomes exclusivos. Além disso, você pode explorar outros recursos de web scraping visitando a seção documentação. Caso você precise discutir alguma dúvida ou preocupação, escreva para nós no fórum.

Veja também

Crie um Web Scraper em C#