视觉有助于更清晰、更快速、更轻松地理解事物。因此,出于多种原因,图像通常在网络上使用。有时您可能需要从不同的网页下载图像。因此,本文介绍了如何在 C# 中从 URL 下载图像。它还包含一些下载资源,以便您可以使用即插即用的项目简单地测试图像下载。
C# Web Scraping API 安装以下载图像
Aspose.HTML for .NET 是一个网页抓取 C# 库,可用于从网页或 HTML 文件中提取数据或信息。您可以通过从 New Releases 部分下载参考 DLL 文件或使用以下 NuGet 安装命令轻松配置 API:
PM> Install-Package Aspose.Html
从 C# 中的 URL 下载图像
您可以通过简单的 API 调用轻松地从 C# 中的 URL 下载图像。同样,您可以处理 HTML 和其他网页格式来下载图像。您可以从输入文档中收集IMG 或OBJECT 元素中的所有图片,并将它们写入具有唯一名称的指定文件夹。此外,它还支持保存 PNG、JPG 以及 SVG 图像。请按照以下步骤从 C# 中的 URL 下载图像:
- 创建一个 Image 类以使用 URL、MimeType 和 Content。
- 从 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 存储库 克隆工作示例项目或从 Google Drive 以 ZIP 文件的形式访问它来找到即插即用 C# 演示应用程序。
获得免费评估许可证
您可以通过申请 免费临时许可证 来避免评估限制。
结论
在本文中,您学习了如何从 URL 或 C# 下载图像。同样,您可以根据需要从 HTML 页面下载图像,因为 API 可以解析图像的相对路径。它使您能够以唯一的名称保存 JPG、PNG 或 SVG 格式的图像。此外,您可以通过访问 documentation 部分来探索其他网络抓取功能。如果您需要讨论任何疑问或疑虑,请在 论坛 上给我们写信。