You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:45:38