Visuella bilder är användbara för att förstå saker tydligare, snabbare och enklare. Därför används bilder ofta över webben av många anledningar. Ibland kan du behöva ladda ner bilder från olika webbsidor. Följaktligen täcker den här artikeln hur man laddar ner bild från URL i C#. Den innehåller också några nedladdningsresurser så att du helt enkelt kan testa nedladdning av bilder med ett plug-and-play-projekt.
C# Web Scraping API-installation för att ladda ner bild
Aspose.HTML for .NET är ett webbskrapande C#-bibliotek som kan användas för att extrahera data eller information från webbsidor eller HTML-filer. Du kan enkelt konfigurera API:t genom att ladda ner referens-DLL-filerna från avsnittet New Releases eller använda följande installationskommando NuGet:
PM> Install-Package Aspose.Html
Ladda ner bild från URL i C#
Du kan enkelt ladda ner bild från URL i C# med enkla API-anrop. På samma sätt kan du bearbeta HTML och andra webbsidesformat för att ladda ner bilderna. Du kan samla alla bilder från elementen IMG eller OBJECT från inmatningsdokumentet och skriva dem till den angivna mappen med unika namn. Dessutom stöder det att spara PNG, JPG och SVG-bilder. Följ stegen nedan för att ladda ner bilder från URL:en i C#:
- Skapa en bildklass för att arbeta med URL, MimeType och Content.
- Hämta bilden från IMG- eller OBJECT-elementet.
- Skriv bilden till disken med ImageSaver-klassen.
Följande kodexempel visar hela processen för att ladda ner bilden programmatiskt i C#:
namespace DownloadImage
{
class Program
{
static void Main(string[] args)
{
// Du kan få en GRATIS utvärderingslicens på https://purchase.aspose.com/temporary-license
Aspose.Html.License license = new License();
license.SetLicense("License.lic");
// Ställ in sökväg för att läsa eller skriva data på disken
string dataDir = @"D:\Image Web Scraping\";
// Ange sökväg för att läsa indatafil från lokal disk
//använder var doc = new HTMLDocument(dataDir + "Sample.html");
// Ange URL för att ladda ner bild från URL i 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);
}
}
}
Ladda ner ett fungerande exempelprojekt
Du kan hitta en plug-and-play C#-demoapplikation genom att klona det fungerande exempelprojektet från GitHub Repository eller få tillgång till det som en ZIP-fil från Google Drive.
Skaffa en gratis utvärderingslicens
Du kan undvika utvärderingsbegränsningarna genom att begära en gratis temporär licens.
Slutsats
I den här artikeln har du lärt dig hur du laddar ner bild från URL eller i C#. På samma sätt kan du ladda ner bilder från en HTML-sida enligt dina krav eftersom API:et kan lösa de relativa sökvägarna till bilder. Det gör att du kan spara bilder i JPG-, PNG- eller SVG-format med unika namn. Dessutom kan du utforska andra webbskrapningsfunktioner genom att besöka avsnittet dokumentation. Om du behöver diskutera några frågor eller funderingar, skriv till oss på forumet.