تنزيل الصورة من URL C#

المرئيات مفيدة لفهم الأشياء بشكل أوضح وأسرع وأسهل. وبالتالي ، تُستخدم الصور بشكل شائع عبر الويب لأسباب عديدة. قد تحتاج أحيانًا إلى تنزيل الصور من صفحات ويب مختلفة. وفقًا لذلك ، تتناول هذه المقالة كيفية تنزيل الصورة من URL في C#. يحتوي أيضًا على بعض موارد التنزيل بحيث يمكنك ببساطة اختبار تنزيل الصور باستخدام نوع مشروع من نوع التوصيل والتشغيل.

تثبيت C# Web Scraping API لتنزيل الصورة

Aspose.HTML for .NET عبارة عن مكتبة C# للتخلص من الويب يمكن استخدامها لاستخراج البيانات أو المعلومات من صفحات الويب أو ملفات HTML. يمكنك تكوين API بسهولة عن طريق تنزيل ملفات DLL المرجعية من قسم الإصدارات الجديدة ، أو باستخدام أمر التثبيت NuGet التالي:

PM> Install-Package Aspose.Html

تنزيل الصورة من URL في C#

يمكنك بسهولة تنزيل الصورة من URL في C# باستدعاءات API بسيطة. وبالمثل ، يمكنك معالجة HTML وتنسيقات صفحات الويب الأخرى لتنزيل الصور. يمكنك جمع كل الصور من عناصر IMG أو كائن من مستند الإدخال وكتابتها إلى المجلد المحدد بأسماء فريدة. علاوة على ذلك ، فهو يدعم حفظ صور PNG و JPG وكذلك صور SVG. يرجى اتباع الخطوات أدناه لتنزيل الصور من URL في C#:

  • قم بإنشاء فئة صورة للعمل مع URL و MimeType والمحتوى.
  • قم بإحضار الصورة من عنصر IMG أو OBJECT.
  • اكتب الصورة على القرص باستخدام فئة ImageSaver.

توضح نماذج التعليمات البرمجية التالية العملية برمتها لتنزيل الصورة برمجيًا في C#:

namespace DownloadImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // يمكنك الحصول على ترخيص تقييم مجاني على https://purchase.aspose.com/tertain-license
            Aspose.Html.License license = new License();
            license.SetLicense("License.lic");

            // اضبط المسار لقراءة البيانات أو كتابتها على القرص
            string dataDir = @"D:\Image Web Scraping\";

            // حدد مسارًا لقراءة ملف الإدخال من القرص المحلي
            //باستخدام var doc = new 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);
        }
    }
}

تنزيل مشروع نموذج العمل

يمكنك العثور على تطبيق تجريبي لـ Plug-and-play C# عن طريق استنساخ نموذج العمل من GitHub Repository أو الوصول إليه كملف ZIP من Google Drive.

احصل على رخصة تقييم مجانية

يمكنك تجنب قيود قيود التقييم من خلال طلب ترخيص مؤقت مجاني.

استنتاج

في هذه المقالة ، تعلمت كيفية تنزيل الصورة من URL أو في C#. وبالمثل ، يمكنك تنزيل الصور من صفحة HTML وفقًا لمتطلباتك لأن واجهة برمجة التطبيقات يمكنها حل المسارات ذات الصلة للصور. يمكّنك من حفظ الصور بتنسيق JPG أو PNG أو SVG بأسماء فريدة. علاوة على ذلك ، يمكنك استكشاف ميزات تجريف الويب الأخرى من خلال زيارة قسم التوثيق. في حال احتجت إلى مناقشة أي استفسارات أو مخاوف ، يرجى مراسلتنا على المنتدى.

أنظر أيضا

إنشاء أداة مكشطة ويب في C#