從 URL C# 下載圖像

視覺效果有助於更清晰、更快速、更輕鬆地理解事物。因此,出於多種原因,圖像在網絡上普遍使用。有時您可能需要從不同的網頁下載圖像。因此,本文介紹瞭如何在 C# 中從 URL 下載圖像。它還包含一些下載資源,以便您可以使用即插即用的項目簡單地測試圖像下載。

C# Web Scraping API 安裝下載圖片

Aspose.HTML for .NET 是一個網絡抓取 C# 庫,可用於從網頁或 HTML 文件中提取數據或信息。您可以通過從 New Releases 部分下載參考 DLL 文件或使用以下 NuGet 安裝命令輕鬆配置 API:

PM> Install-Package Aspose.Html

在 C# 中從 URL 下載圖像

您可以使用簡單的 API 調用在 C# 中輕鬆地從 URL 下載圖像。同樣,您可以處理 HTML 和其他網頁格式來下載圖像。您可以從輸入文檔的 IMGOBJECT 元素中收集所有圖片,並將它們寫入具有唯一名稱的指定文件夾。此外,它支持保存 PNG、JPG 以及 SVG 圖像。請按照以下步驟在 C# 中從 URL 下載圖像:

  • 創建一個圖像類以使用 URL、MimeType 和內容。
  • 從 IMG 或 OBJECT 元素中獲取圖像。
  • 使用 ImageSaver 類將圖像寫入磁盤。

以下代碼示例演示了在 C# 中以編程方式下載圖像的整個過程:

namespace DownloadImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // 您可以在 https://purchase.aspose.com/temporary-license 獲得免費的評估許可證
            Aspose.Html.License license = new License();
            license.SetLicense("License.lic");

            // 設置在磁盤上讀取或寫入數據的路徑
            string dataDir = @"D:\Image Web Scraping\";

            // 指定從本地磁盤讀取輸入文件的路徑
            //使用 var doc = new HTMLDocument(dataDir + "Sample.html");

            // 在 C# 中指定從 URL 下載圖像的 URL
            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);
        }
    }
}

下載工作示例項目

您可以通過從 GitHub 存儲庫 克隆工作示例項目或從 Google Drive 以 ZIP 文件形式訪問它來找到即插即用的 C# 演示應用程序。

獲得免費評估許可證

您可以通過申請 免費臨時許可證 來避免評估限制。

結論

在本文中,您學習瞭如何從 URL 或 C# 下載圖像。同樣,您可以根據需要從 HTML 頁面下載圖像,因為 API 可以解析圖像的相對路徑。它使您能夠保存具有唯一名稱的 JPG、PNG 或 SVG 格式圖像。此外,您可以通過訪問 文檔 部分來探索其他網絡抓取功能。如果您需要討論任何疑問或疑慮,請在 論壇 上寫信給我們。

也可以看看

在 C# 中創建一個 Web Scraper