如何保存来自 CapturePreviewAsync 流的图像?

How do I save an image from CapturePreviewAsync stream?

我不太了解 Async,但是当 运行 时我没有得到任何错误,而且我仍然没有在 C:\temp\test.jpg 中得到图像- 我做错了什么?

Private Sub WebView22_Click(sender As Object, e As EventArgs) Handles WebView22.Click
    grabpic()
End Sub

Public Async Function grabpic() As Threading.Tasks.Task
    Dim ms As System.IO.Stream
    Await (WebView22.CoreWebView2.CapturePreviewAsync(CoreWebView2CapturePreviewImageFormat.Jpeg, ms))
    Dim file As New System.IO.FileStream("C:\temp\test.jpg", IO.FileMode.Create)
    ms.CopyTo(file)
    ms.Close()
End Function

您的代码存在一些问题:

  1. 您没有等待 graphics() 函数,因此异常被默默地吞噬了。此外,我不确定是什么触发了 WebView2 控件的 Click 事件(假设它实际上可以被触发)。因此,例如,您可能应该使用按钮点击进行测试。

  2. 您根本没有初始化 ms,这将导致 NullReferenceException。您可能想创建 MemoryStream.

    的实例
  3. 您正在 ms.CopyTo 写入流后调用。届时,当前位置将位于流的末尾,并且不会向 file 写入任何内容。您需要在开头设置位置(即 ms.Seek(0, SeekOrigin.Begin) 或使用 ms.WriteTo() 代替。

这样,graphics() 方法将如下所示:

Public Async Function grabpic() As Task
    Using ms As New IO.MemoryStream()
        Await WebView22.CoreWebView2.CapturePreviewAsync(
            CoreWebView2CapturePreviewImageFormat.Jpeg, ms)
        Using file As New IO.FileStream("C:\temp\test.jpg", IO.FileMode.Create)
            ms.Seek(0, IO.SeekOrigin.Begin)
            ms.CopyTo(file)
        End Using
    End Using
End Function

但是,在这种情况下您并不真正需要 MemoryStream。您可以直接写入 FileStream。最终代码应如下所示:

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Await grabpic()
End Sub

Public Async Function grabpic() As Task
    Using file As New IO.FileStream("C:\temp\test.jpg", IO.FileMode.Create)
        Await WebView22.CoreWebView2.CapturePreviewAsync(
            CoreWebView2CapturePreviewImageFormat.Jpeg, file)
    End Using
End Function