将面板句柄绘制到位图

Posted

技术标签:

【中文标题】将面板句柄绘制到位图【英文标题】:Drawing a Panels Handle to a Bitmap 【发布时间】:2021-12-13 00:22:48 【问题描述】:

我有一个托管 WinformsPanel 的 WPF 应用程序

<WindowsFormsHost>
    <windowsForms:Panel 
        x:Name="PlayerHost">
    </windowsForms:Panel>
<WindowsFormsHost>

然后我使用此面板显示视频。我正在使用Mpv.NET lib 来执行此操作。 视频播放器已正确初始化:

//panel.Handle is the windowsForms:Panel named PlayerHost 
player = new MpvPlayer(panel.Handle, Common.IO.FindLib.FindMpvLib(binaryPath));
player.Load(videoFilePath);

现在,如果我尝试绘制面板内容,生成的图像仍然是空白的。绘制图像的代码如下:

using (var bmp = new Bitmap(panel.ClientSize.Width, panel.ClientSize.Height))

    panel.DrawToBitmap(bmp, panel.ClientRectangle);
    bmp.Save(@"Some:\path.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

为了清楚起见:视频会显示出来。我可以看到视频内容。当媒体正确加载时,我开始绘制图像。我什至将绘图命令卸载到单击按钮。因此,当视频运行时,我尝试进行“帧捕获”,可以这么说。但是图像仍然是空白的。

如何捕获面板内容?它与提供给视频播放器的本机句柄有关吗?提前致谢。

【问题讨论】:

仅供参考,您可以直接在 WPF 表单中显示视频 - 您不需要为此托管表单面板。 --- 这里没有关于您如何实际尝试捕获帧的信息。 你是说媒体元素? Mpv 对我来说似乎更强大,支持的编解码器种类更多。最后一部分显示捕获。视频被渲染到面板上,我的想法,将面板内容保存到位图,不起作用。 【参考方案1】:

您可以使用以下代码将面板内容保存到位图:

using (Bitmap b = new Bitmap(panel.Width, panel.Height))

    panel.DrawToBitmap(b, new Rectangle(0, 0, b.Width, b.Height));
    b.Save("test.png");

【讨论】:

这正是我尝试过的以及在这种情况下不起作用的方法。

以上是关于将面板句柄绘制到位图的主要内容,如果未能解决你的问题,请参考以下文章

将 OpenGL 绘制到离屏位图

将视频帧捕获到位图数据(额外-将位图添加到PV3D材质)

围绕一个点而不是中心旋转位图到位图

canvas.drawBitmap 仅绘制最后修改的位图,不绘制中间图

如何将图像添加到位图

将具有 alpha 的位图图层渲染到 FBO