ดาวน์โหลดรูปภาพจาก URL C#

ภาพช่วยให้เข้าใจสิ่งต่างๆ ได้ชัดเจนขึ้น เร็วขึ้น และง่ายขึ้น ดังนั้น รูปภาพจึงถูกนำมาใช้กันทั่วไปบนเว็บด้วยเหตุผลหลายประการ บางครั้งคุณอาจต้องดาวน์โหลดรูปภาพจากหน้าเว็บต่างๆ ดังนั้น บทความนี้จึงครอบคลุมถึงวิธีการดาวน์โหลดรูปภาพจาก URL ใน C# นอกจากนี้ยังมีทรัพยากรการดาวน์โหลดบางอย่าง เพื่อให้คุณสามารถทดสอบการดาวน์โหลดรูปภาพด้วยโปรเจ็กต์ประเภท Plug-and-Play

การติดตั้ง C# Web Scraping API เพื่อดาวน์โหลดอิมเมจ

Aspose.HTML for .NET คือไลบรารี่ C# สำหรับการขูดเว็บที่สามารถใช้เพื่อดึงข้อมูลหรือข้อมูลจากเว็บเพจหรือไฟล์ HTML คุณสามารถกำหนดค่า API ได้ง่ายๆ ด้วยการดาวน์โหลดไฟล์ DLL อ้างอิงจากส่วน New Releases หรือใช้คำสั่งติดตั้ง NuGet ต่อไปนี้:

PM> Install-Package Aspose.Html

ดาวน์โหลดรูปภาพจาก URL ใน C#

คุณสามารถดาวน์โหลดรูปภาพจาก URL ใน C# ด้วยการเรียก API อย่างง่าย ในทำนองเดียวกัน คุณสามารถประมวลผล HTML และรูปแบบเว็บเพจอื่นๆ เพื่อดาวน์โหลดรูปภาพ คุณสามารถรวบรวมรูปภาพทั้งหมดจากองค์ประกอบ IMG หรือ OBJECT จากเอกสารอินพุตและเขียนไปยังโฟลเดอร์ที่ระบุด้วยชื่อเฉพาะ นอกจากนี้ยังรองรับการบันทึกรูปภาพ PNG, JPG และ SVG โปรดทำตามขั้นตอนด้านล่างเพื่อดาวน์โหลดรูปภาพจาก URL ใน C#:

  • สร้างคลาสรูปภาพเพื่อทำงานกับ 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 = HTMLDocument ใหม่ (dataDir + "Sample.html");

            // ระบุ URL เพื่อดาวน์โหลดรูปภาพจาก URL ใน 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);
        }
    }
}

ดาวน์โหลดโครงการตัวอย่างการทำงาน

คุณสามารถค้นหาแอปพลิเคชันสาธิต C# แบบปลั๊กแอนด์เพลย์ได้โดยการโคลนโครงการตัวอย่างที่ใช้งานได้จาก GitHub Repository หรือเข้าถึงเป็นไฟล์ ZIP จาก Google Drive

รับใบอนุญาตการประเมินฟรี

คุณสามารถหลีกเลี่ยงข้อจำกัดข้อจำกัดการประเมินได้โดยขอ ใบอนุญาตชั่วคราวฟรี

บทสรุป

ในบทความนี้ คุณได้เรียนรู้วิธีดาวน์โหลดรูปภาพจาก URL หรือใน C# ในทำนองเดียวกัน คุณสามารถดาวน์โหลดรูปภาพจากหน้า HTML ตามความต้องการของคุณ เนื่องจาก API สามารถแก้ไขเส้นทางสัมพัทธ์ไปยังรูปภาพได้ ช่วยให้คุณบันทึกรูปภาพรูปแบบ JPG, PNG หรือ SVG ด้วยชื่อเฉพาะ นอกจากนี้ คุณสามารถสำรวจคุณสมบัติการขูดเว็บอื่นๆ ได้โดยไปที่ส่วน เอกสารประกอบ ในกรณีที่คุณต้องการหารือเกี่ยวกับคำถามหรือข้อกังวลใดๆ โปรดเขียนถึงเราที่ ฟอรัม

ดูสิ่งนี้ด้วย

สร้าง Web Scraper ใน C#