【问题标题】:How do I save an image from CapturePreviewAsync stream?如何从 CapturePreviewAsync 流中保存图像?
【发布时间】:2022-01-15 12:00:03
【问题描述】:

我对@9​​87654321@ 不太了解,但是运行它时我没有收到任何错误,而且我仍然没有在 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

【问题讨论】:

    标签: vb.net winforms async-await webview2


    【解决方案1】:

    您的代码存在一些问题:

    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
    

    【讨论】:

    • 非常感谢。我正在尝试您的建议,但收到此错误:未定义错误 BC30002 类型“任务”。与 Public Async Function grabpic() As Task 相关
    • @Thomas 您使用的是什么版本的 .NET?尝试使用原始代码中的...As Threading.Tasks.Task,或在文件顶部添加Imports System.Threading.Tasks
    • 它只需要是 Threading.Tasks.Task - 你就是一个救生员。非常感谢你在这里帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多