URL C#에서 이미지 다운로드

시각 자료는 사물을 더 명확하고 빠르고 쉽게 이해하는 데 도움이 됩니다. 따라서 이미지는 여러 가지 이유로 웹에서 일반적으로 사용됩니다. 때로는 다른 웹 페이지에서 이미지를 다운로드해야 할 수도 있습니다. 따라서 이 기사에서는 C#의 URL에서 이미지를 다운로드하는 방법을 다룹니다. 또한 일부 다운로드 리소스가 포함되어 있어 플러그 앤 플레이 유형의 프로젝트로 이미지 다운로드를 간단히 테스트할 수 있습니다.

이미지 다운로드를 위한 C# 웹 스크래핑 API 설치

Aspose.HTML for .NET은 웹 페이지나 HTML 파일에서 데이터나 정보를 추출하는 데 사용할 수 있는 웹 스크래핑 C# 라이브러리입니다. New Releases 섹션에서 참조 DLL 파일을 다운로드하거나 다음 NuGet 설치 명령을 사용하여 API를 쉽게 구성할 수 있습니다.

PM> Install-Package Aspose.Html

C#의 URL에서 이미지 다운로드

간단한 API 호출로 C#의 URL에서 이미지를 쉽게 다운로드할 수 있습니다. 마찬가지로 HTML 및 기타 웹 페이지 형식을 처리하여 이미지를 다운로드할 수 있습니다. 입력 문서에서 IMG 또는 OBJECT 요소의 모든 그림을 수집하고 고유한 이름으로 지정된 폴더에 쓸 수 있습니다. 또한 PNG, JPG 및 SVG 이미지 저장을 지원합니다. C#의 URL에서 이미지를 다운로드하려면 아래 단계를 따르십시오.

  • URL, MimeType 및 Content와 함께 작동하는 Image 클래스를 만듭니다.
  • 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 Repository에서 작업 샘플 프로젝트를 복제하여 플러그 앤 플레이 C# 데모 애플리케이션을 찾거나 Google 드라이브에서 ZIP 파일로 액세스할 수 있습니다.

무료 평가판 라이선스 받기

무료 임시 라이선스를 요청하여 평가 제한 제한을 피할 수 있습니다.

결론

이 기사에서는 URL 또는 C#에서 이미지를 다운로드하는 방법을 배웠습니다. 마찬가지로 API가 이미지에 대한 상대 경로를 확인할 수 있으므로 요구 사항에 따라 HTML 페이지에서 이미지를 다운로드할 수 있습니다. JPG, PNG 또는 SVG 형식 이미지를 고유한 이름으로 저장할 수 있습니다. 또한 문서 섹션을 방문하여 다른 웹 스크래핑 기능을 탐색할 수 있습니다. 질문이나 우려 사항에 대해 논의해야 하는 경우 포럼에 글을 보내주십시오.

또한보십시오

C#으로 웹 스크레이퍼 만들기