1.正则匹配html中的img标签,取出img的url并进行图片文件下载;

 1         /// <summary>
 2         /// 将image标签的src属性的url替换为base64
 3         /// </summary>
 4         /// <param name="questionHtml"></param>
 5         /// <returns>返回替换imgurl后的questionHtml</returns>
 6         public string GetBase64ImgHtml(string questionHtml)
 7         {
 8            //获取<question></question>标签[获取某个标签时的表达式]
 9            // Regex regQuestion = new Regex(@"<question\b*[^<>]*?\b[\s\S]*>([\s\S]*)</question>", RegexOptions.IgnoreCase);
10
11             string retHtml = string.Empty;
12             //Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
13             //去掉分组中的 \s 防止图片的链接中含有空格导致匹配的url不全的问题
14             Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
15             // 搜索匹配的字符串   
16             MatchCollection matches = regImg.Matches(questionHtml);
17             var list = new List<string>();
18
19             // 取得匹配项列表,并逐一替换成imgUrl   
20             foreach (Match match in matches)
21             {
22                 try
23                 {
24                     string imgUrl = match.Groups["imgUrl"].Value;
25                     string imgType = imgUrl.Substring(imgUrl.LastIndexOf(".") + 1);
26                     WebClient webClient = new WebClient();
27                     Byte[] imgBytes = webClient.DownloadData(imgUrl);
28                     string imgBase64Data = Convert.ToBase64String(imgBytes);
29                     questionHtml = questionHtml.Replace(imgUrl, $"");
30                 }
31                 catch (Exception ex)
32                 {
33                     continue;
34                 }
35             }
36
37             return questionHtml;
38         }

通过以上方法,就可以轻松将html中img标签转换为base64;

2.html中img标签中的base64转换为url

其实处理的思路都是一样的,正则匹配base64 的img也都基本一致(<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgData>[^""'<>]*)[^<>]*?/?[\s\t\r\n]*>)。但是此处还是值得记录一下。获取到img标签中的base64 字符串后,将其转存为本地图片的过程中,部分png格式图片转存失败,在用内存流初始化 BitMap 对象的时,一直报“参数无效错误”,但是用该种方式转存Jpg图片完全OK。

 1 1.通过这种方式,部分 png 图片转存时会报错:参数无效
 2  var bytes = Convert.FromBase64String(base64Str);
 3                using(var ms = new System.IO.MemoryStream(bytes, true)){
 4                 //var bitmap = new Bitmap(ms);
 5                 var  bitmap =Image.FromStream();
 6               bitmap.Save(imgPath);
 7                bitmap.Dispose();
 8               ms.Close();
 9 }
10
11 2.直接改成将字节写入文件的方式处理;解决问题。
12    var bytes = Convert.FromBase64String(base64Str);
13     File.WriteAllBytes(imgPath, bytes);
01-02 05:25