至于wpf,肯定有很多朋友不知道边肖的WPF是什么样的。今天,边肖将简单地向所有人普及基本概念。
wpf(Windows presentation foundation)是微软推出的基于Windows的用户界面框架,属于的一部分。NET框架3.0。它提供了统一的编程模型、语言和框架,真正将界面设计者和开发人员分开。同时,它提供了一个全新的多媒体交互式用户图形界面。
首先,视频演示
不久前,在一个wpf项目中,ip摄像机需要实时显示。我想每个人都应该知道很多解决方案。在winform中,我们可以将一个控件的句柄(通常是panel或者pictruebox)抛出到相机的sdk中来实现这个功能,而在wpf中,我们也可以使用这个方案来快速实现。
以海康平台为例,海康sdk要求我们传递一个控件的句柄。winform可以直接使用控件的handle属性来获取句柄,而在wpf中我们有两种方法:
1.使用WindowsFormsHost作为容器来嵌套winform控件,如panel,与winform相同;
2.请使用((hwndsource) presentationsource。fromvisual(您的wpf元素))。直接处理;得到处理;
二、叠加控制
简单的视频显示可以用第1部分的方案来解决,但是我接手的项目是一个使用摄像头视频进行AR处理的程序。界面上需要显示很多图标和信息栏。最重要的是整个主程序的背景是实时摄像头图像,除此之外还有各种子窗口,子窗口中也使用了视频,这就不可避免地涉及到在视频图像上叠加控件的问题。
1.使用微软。需要
之所以说它是一个难题,是因为微软正在努力解决它,但并没有给出一个真正完美的解决方案。这个问题就是著名的空域问题。这里有一个park friends的短文链接,主要介绍微软目前的解决方案://www . JB 51 . net/article/110896 . htm,虽然这个解决方案在我的实际使用中可以正常的将控件叠加在视频上,但是拖动顶部的控件还是很卡的。通常鼠标已经移动到右侧,被拖动的控件仍然不愿意离开。连发布版都没用。
2.对视频流进行转码,并使用d3d将其渲染为ImageSource
这个方案比较麻烦,需要你自己控制转码过程。这里有一个关于这个方案的文章链接://www . JB 51 . net/article/110898 . htm我准备了一个演示(不是我自己写的)在这里:https://pan.baidu.com/s/1i59OZC5,下面是正在运行的演示的截图:
一般原理是利用sdk的回调机制逐帧获取码流,然后用direct进行渲染;
这个方案除了代码量比较大之外,还是有和1一样的问题,拖动的时候控件还是卡住了,所以各位朴友不知道有什么好的解决方案。
3.最终解决方案
当1和2都没有达到理想的要求时,我突然意识到一个问题。为什么会出现空域问题?那是因为winform和wpf有不同的渲染方法。如果他们统一了,问题会解决吗?只能说解决方案是一半。如果需要叠加的控件是表现良好的矩形,换句话说,那些不需要透明通道的控件可以使用这种方案,但是那些圆角的控件需要另谋出路。先说前者。简单的代码如下:
WFI : WindowsFormsHost wf : panel//WFI : WindowsFormsHost Width=' 114 ' Height=' 152 ' ElementHostBorder Width=' 114 ' Height=' 152 '/ElementHost/事实上,WFI 3360 WindowsFormsHost在WindowsFormsHost上设置了另一个ElementHost。现在,视频面板及其上方的边框控件都包含在WindowsFormsHost中,所以渲染时边框不会覆盖到底层。
先说一下我个人认为最难的不规则控件的叠加方法。如果你能在wpf应用中通过代码让WindowsFormsHost的背景变得透明,那么你就不需要再往下看了。请联系我。我觉得这是最好的解决办法,接下来我要讲的解决办法可能会让你不屑一顾,甚至嘲笑。
我的方法很简单,就是我用两个窗口,底部窗口单独显示视频并设置为主窗口,顶部窗口设置AllowsTransparency=' True ',showInTaskbar='False ',在显示顶部窗口时,我用showdialog代替Show,可以保证用户始终可以在顶部窗口操作,永远不会到达视频窗口。针对子窗口,虽然可以用popup来模拟上述过程,但也存在很多问题,比如两个子窗口重叠时,很明显有视频的窗口在底部,但由于视频部分是通过popup显示的,所以会显示在顶部窗口,完美实现了窗口洗牌的特殊效果。此外,您需要一个特殊的偏移量来控制弹出窗口的位置。有鉴于此,我建议你定制一个专门用来弹出信息的表单,然后把包含视频的控件作为子元素传入其中。
最后的解决办法就是把这三种结合起来。由于主界面是实时视频背景,任何拖动操作都不应延迟。所以主界面使用3号方案,而有些子界面不涉及上面拖拽,那么可以使用1号方案。至于2号方案,可以用来兼容各大视频平台。比如有些视频平台不支持引入手柄。
以上就是边肖介绍的在WPF的摄像头视频上叠加控件的解决方案。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!