如何基于Webview2控件实现类似旧WebBrowser的图片下载功能?
使用WebView2实现图片下载并转换为Bitmap的方案
由于WebView2没有直接提供WebRequest类,且直接使用System.Net.WebRequest会丢失WebView2中的登录会话Cookie(导致需要权限的图片请求失败),可以通过以下两种方案实现需求:
方案一:复用WebView2会话Cookie发起请求
通过WebView2的Cookie管理器获取登录会话的Cookie,添加到请求头中,保持原有代码的逻辑结构:
Private Async Function GetBitmapFromLinkWithWebView2Cookies(ByVal imagePath As String, ByVal webView2 As WebView2) As Task(Of Image) ' 确保WebView2核心控件已初始化 If webView2.CoreWebView2 Is Nothing Then Await webView2.EnsureCoreWebView2Async() End If ' 获取目标图片URL对应的会话Cookie Dim cookieManager = webView2.CoreWebView2.CookieManager Dim cookies = Await cookieManager.GetCookiesAsync(imagePath) ' 构建请求并注入Cookie Dim request As HttpWebRequest = CType(WebRequest.Create(imagePath), HttpWebRequest) Dim cookieHeader As New StringBuilder() For Each cookie In cookies cookieHeader.Append($"{cookie.Name}={cookie.Value}; ") Next If cookieHeader.Length > 0 Then request.Headers.Add(HttpRequestHeader.Cookie, cookieHeader.ToString().TrimEnd(";"c, " "c)) End If ' 发送请求并转换为Bitmap Using response As HttpWebResponse = CType(Await request.GetResponseAsync(), HttpWebResponse) Using responseStream As Stream = response.GetResponseStream() Return New Bitmap(responseStream) End Using End Using End Function
方案特点
- 与原有WebBrowser的实现逻辑高度一致,迁移成本低
- 主动复用WebView2的登录会话,确保有权限访问需要登录验证的图片
方案二:通过WebView2的下载事件获取图片流
利用WebView2的DownloadStarting事件,让WebView2直接处理图片请求,自动携带所有会话信息:
Private Async Function GetBitmapFromLinkViaWebView2Download(ByVal imagePath As String, ByVal webView2 As WebView2) As Task(Of Image) ' 确保WebView2核心控件已初始化 If webView2.CoreWebView2 Is Nothing Then Await webView2.EnsureCoreWebView2Async() End If Dim tcs As New TaskCompletionSource(Of Image) Dim downloadHandler As EventHandler(Of CoreWebView2DownloadStartingEventArgs) = Nothing downloadHandler = Sub(sender, e) ' 仅处理目标图片的下载请求 If e.Uri.Equals(imagePath, StringComparison.OrdinalIgnoreCase) Then ' 取消默认的磁盘保存行为 e.Cancel = True ' 从下载流中创建Bitmap Using stream As Stream = e.ResultStream tcs.SetResult(New Bitmap(stream)) End Using ' 移除事件处理器,避免内存泄漏 webView2.CoreWebView2.DownloadStarting -= downloadHandler End If End Sub ' 注册下载事件监听 webView2.CoreWebView2.DownloadStarting += downloadHandler ' 通过JS触发图片下载请求 Dim escapedUrl = imagePath.Replace("'", "\'") Await webView2.CoreWebView2.ExecuteScriptAsync($"var img = new Image(); img.src = '{escapedUrl}';") Return Await tcs.Task End Function
方案特点
- 完全由WebView2处理请求,自动携带Cookie、User-Agent等所有会话信息,适配复杂场景
- 无需手动处理Cookie拼接,减少出错概率
注意事项
- 两种方案都必须确保WebView2的
CoreWebView2已完成初始化,否则会抛出空引用异常 - 若图片URL为相对路径,需先通过
webView2.CoreWebView2.Source或JS的window.location.origin拼接为绝对URL - 处理流时务必使用
Using语句,确保资源及时释放,避免内存泄漏 - 批量处理大量图片时,建议采用异步并发模式,但需注意WebView2的UI线程操作限制
内容的提问来源于stack exchange,提问作者Eric F
相关产品推荐
相关产品推荐

