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, $"data:image/{imgType};base64,{imgBase64Data}"); 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);