הורד תמונה מ-URL C#

חזותיים מועילים להבין דברים ברורים יותר, מהירים יותר וקלים יותר. לפיכך, משתמשים בתמונות בדרך כלל באינטרנט מסיבות רבות. לפעמים ייתכן שיהיה עליך להוריד תמונות מדפי אינטרנט שונים. בהתאם לכך, מאמר זה מכסה כיצד להוריד תמונה מ-URL ב-C#. הוא מכיל גם כמה משאבי הורדה, כך שתוכלו פשוט לבדוק הורדת תמונה עם פרויקט מסוג plug-and-play.

התקנת API של C# Web Scraping להורדת תמונה

Aspose.HTML for .NET היא ספריית C# לגירוד אינטרנט שניתן להשתמש בה כדי לחלץ נתונים או מידע מדפי אינטרנט או קובצי HTML. אתה יכול בקלות להגדיר את ה-API על ידי הורדת קובצי ה-DLL הפניה מהסעיף מהדורות חדשות או שימוש בפקודת ההתקנה הבאה של NuGet:

PM> Install-Package Aspose.Html

הורד תמונה מ-URL ב-C#

אתה יכול בקלות להוריד תמונה מ-URL ב-C# באמצעות קריאות API פשוטות. כמו כן, אתה יכול לעבד HTML ופורמטים אחרים של דפי אינטרנט כדי להוריד את התמונות. אתה יכול לאסוף את כל התמונות מהאלמנטים IMG או OBJECT ממסמך הקלט ולכתוב אותם לתיקיה שצוינה עם שמות ייחודיים. יתר על כן, הוא תומך בשמירת PNG, JPG, כמו גם תמונות SVG. אנא בצע את השלבים שלהלן כדי להוריד תמונות מכתובת האתר ב-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 = new HTMLDocument(dataDir + "Sample.html");

            // ציין את כתובת האתר להורדת תמונה מ-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# של plug-and-play על ידי שיבוט של פרויקט הדוגמה הפועל מ-GitHub Repository או לגשת אליו כקובץ ZIP מ-Google Drive.

קבל רישיון הערכה בחינם

אתה יכול להימנע מהגבלות מגבלות ההערכה על ידי בקשת [רישיון זמני ללא תשלום].

סיכום

במאמר זה, למדת כיצד להוריד תמונה מ-URL או ב-C#. כמו כן, אתה יכול להוריד תמונות מדף HTML לפי הדרישות שלך מכיוון שה-API יכול לפתור את הנתיבים היחסיים לתמונות. זה מאפשר לך לשמור תמונות בפורמט JPG, PNG או SVG עם שמות ייחודיים. יתר על כן, אתה יכול לחקור תכונות אחרות של גירוד אינטרנט על ידי ביקור בסעיף תיעוד. במקרה שאתה צריך לדון בשאלות או דאגות כלשהן, אנא כתוב לנו בפורום.

ראה גם

צור מגרד אינטרנט ב-C#