阅读包含Base64-Embedded格式的所有图像的网页

时间:2011-10-04 16:16:12

标签: c# html web

在我的场景中,我想下载一个页面的HTML(互联网上的任何页面)programaticaly,但我也希望HTML中的所有图像都是 base64嵌入格式(未引用) )

换句话说,而不是:

<img src='/images/delete.gif' />

我希望下载的html看起来像这样:

<img src="data:image/gif;base64,R0lGODl..." />

这样我就不需要经历将所有图像存储在目录等中的过程。

你们有谁知道如何做到这一点?或者任何有效执行此操作的插件?

3 个答案:

答案 0 :(得分:6)

嗯,你需要:

  • 下载原始HTML
  • 查找HTML中的每个img元素(例如使用HTML agility pack)和每个元素:
    • 如果它已经在使用数据网址,请忽略它
    • 否则:
    • 下载图片
    • 使用Convert.ToBase64String
    • 在Base64中对其进行编码
    • 将原始img标记替换为使用base64版本的标记(在原始字符串中,或​​通过DOM表示)
  • 将最终的HTML保存到磁盘

这些步骤中的任何一个都会导致您遇到特定问题吗?你可以通过并行下载图像来加快速度,但我会先得到一个串行版本。

答案 1 :(得分:2)

您可以考虑使用MHTML格式,而不是在src属性中使用带有图像作为base64编码字符串的html页面。大多数浏览器都支持该格式,它嵌入了所有外部资源(包括图像)。

var msg = new CDO.MessageClass();
msg.MimeFormatted = true;
msg.CreateMHTMLBody("http://www.google.com", CDO.CdoMHTMLFlags.cdoSuppressNone, "", "");
var stream = msg.GetStream();
var mhtml = stream.ReadText(stream.Size);

答案 2 :(得分:0)

使用正则表达式(正则表达式)从img标记中提取URL,使用Uri类将它们转换为绝对URL,然后使用WebClient下载目标图像。之后,只是使用Convert.ToBase64String来生成Base64。