Tải xuống hình ảnh từ URL C#

Hình ảnh hữu ích để hiểu mọi thứ rõ ràng hơn, nhanh hơn và dễ dàng hơn. Vì vậy, hình ảnh thường được sử dụng trên web vì nhiều lý do. Đôi khi bạn có thể cần tải xuống hình ảnh từ các trang web khác nhau. Theo đó, bài viết này trình bày cách tải xuống hình ảnh từ URL trong C#. Nó cũng chứa một số tài nguyên tải xuống để bạn có thể đơn giản thử nghiệm tải xuống hình ảnh với một loại dự án plug-and-play.

Cài đặt C# Web Scraping API để tải xuống hình ảnh

Aspose.HTML for .NET là một thư viện C# cóp nhặt web có thể được sử dụng để trích xuất dữ liệu hoặc thông tin từ các trang web hoặc tệp HTML. Bạn có thể dễ dàng định cấu hình API bằng cách tải xuống tệp DLL tham chiếu từ phần Bản phát hành mới hoặc sử dụng lệnh cài đặt NuGet sau:

PM> Install-Package Aspose.Html

Tải xuống hình ảnh từ URL trong C#

Bạn có thể dễ dàng tải xuống hình ảnh từ URL trong C# với các lệnh gọi API đơn giản. Tương tự như vậy, bạn có thể xử lý HTML và các định dạng trang web khác để tải hình ảnh xuống. Bạn có thể thu thập tất cả ảnh từ các phần tử IMG hoặc OBJECT từ tài liệu đầu vào và ghi chúng vào thư mục được chỉ định với các tên duy nhất. Hơn nữa, nó hỗ trợ lưu hình ảnh PNG, JPG, cũng như SVG. Vui lòng làm theo các bước bên dưới để tải xuống hình ảnh từ URL trong C#:

  • Tạo một lớp Hình ảnh để làm việc với URL, MimeType và Nội dung.
  • Tìm nạp hình ảnh từ phần tử IMG hoặc OBJECT.
  • Ghi hình ảnh vào đĩa bằng lớp ImageSaver.

Các mẫu mã sau đây minh họa toàn bộ quy trình để tải xuống hình ảnh theo chương trình trong C#:

namespace DownloadImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // Bạn có thể nhận Giấy phép Đánh giá MIỄN PHÍ tại https://purchase.aspose.com/tempional-license
            Aspose.Html.License license = new License();
            license.SetLicense("License.lic");

            // Đặt đường dẫn để đọc hoặc ghi dữ liệu trên đĩa
            string dataDir = @"D:\Image Web Scraping\";

            // Chỉ định đường dẫn để đọc tệp đầu vào từ đĩa cục bộ
            //using var doc = new HTMLDocument (dataDir + "Sample.html");

            // Chỉ định URL để Tải xuống Hình ảnh từ URL trong 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);
        }
    }
}

Tải xuống một dự án mẫu làm việc

Bạn có thể tìm thấy ứng dụng demo C# plug-and-play bằng cách sao chép dự án mẫu đang hoạt động từ GitHub Repository hoặc truy cập nó dưới dạng tệp ZIP từ Google Drive.

Nhận Giấy phép Đánh giá Miễn phí

Bạn có thể tránh các hạn chế về giới hạn đánh giá bằng cách yêu cầu giấy phép tạm thời miễn phí.

Sự kết luận

Trong bài viết này, bạn đã học cách tải xuống hình ảnh từ URL hoặc trong C#. Tương tự như vậy, bạn có thể tải xuống hình ảnh từ một trang HTML theo yêu cầu của bạn vì API có thể phân giải các đường dẫn liên quan đến hình ảnh. Nó cho phép bạn lưu các hình ảnh định dạng JPG, PNG hoặc SVG với các tên riêng. Hơn nữa, bạn có thể khám phá các tính năng tìm kiếm web khác bằng cách truy cập phần tài liệu. Trong trường hợp bạn cần thảo luận về bất kỳ câu hỏi hoặc thắc mắc nào, vui lòng viết thư cho chúng tôi tại diễn đàn.

Xem thêm

Tạo Web Scraper trong C#