我需要拍摄使用通过 EdgeHTML (Spartan) 视图引擎渲染的 JS Service Worker 的网页快照,该引擎可通过 WPF 和 UWP 中的 WebView 1 控件获得。
我在WPF中使用WebView时遇到的问题:不知道如何截图。如果我使用 RenderTargetBitmap 之类的东西(添加命名空间,因为有多个 RenderTargetBitmap):
var bmp = new System.Windows.Media.Imaging.RenderTargetBitmap(1000, 1000, 72, 72, PixelFormats.Default);
bmp.Render(webView1);
var frame = System.Windows.Media.Imaging.BitmapFrame.Create(bmp);
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(frame);
using (var stream = File.Create("fooo.jpg"))
{
encoder.Save(stream);
}
它只是渲染并保存黑帧。
在 UWP 中,我实际上可以拍摄快照并将其保存到文件中,因为 WebView 有这样的方法:
var pics = KnownFolders.SavedPictures;
var file = await pics.CreateFileAsync("foo.jpg");
using (var fileStream = await file.OpenStreamForWriteAsync())
{
var ras = fileStream.AsRandomAccessStream();
await webView1.CapturePreviewToStreamAsync(ras);
}
但这里的问题是,我必须渲染的页面正在使用 ServiceWorker 进行一些 API 模拟,并且在 UWP 应用程序服务中工作不起作用,而与 WPF 相比,它工作得很好! 无法弄清楚为什么 Service Worker 没有在 UWP 嵌入式浏览器中注册。
显然,WebView 控件即使封装了相同的旧版 Edge 引擎,在 WPF 中与 UWP 也有很大不同。
https://www.whatismybrowser.com/ 显示 WPF 和 UWP 中相同、正确的浏览器(Edge 18、EdgeHTML 视图引擎)。
问题是:
using(FileStream fs = File.Create("capture.jpg"))
{
await webView2.CoreWebView2.CapturePreviewAsync(Microsoft.Web.WebView2.Core.CoreWebView2CapturePreviewImageFormat.Jpeg, fs);
}