wpf显示视频,image控件闪屏,使用winform控件实现

使用C#调用mingw的动态库实现视频识别软件,程序通过C++调用opencv打开视频,将图像的原始数据以rgb24的方式传递给C#端,C#通过构造图像对象给控件赋值的方式显示图片。

一开始使用wpf的控件image:

 1 while (true)
 2 {
 3     S_IMG simg = Mingw.display(); //调用取图像函数
 4     int size = simg.w * simg.h * 3;
 5     byte[] data = new byte[size];
 6     Marshal.Copy(simg.pbuf, data, 0, size);
 7     Dispatcher.Invoke((EventHandler)delegate
 8     {
 9         WriteableBitmap bitmap = new WriteableBitmap(simg.w, simg.h, 100, 100, PixelFormats.Rgb24, null);
10         bitmap.WritePixels(new Int32Rect(0, 0, simg.w, simg.h), data, simg.w * 3, 0);
11         img1.Source = bitmap;
12         BitmapEncoder encoder = new JpegBitmapEncoder();
13         encoder.Frames.Add(BitmapFrame.Create(bitmap));
14         encoder.Save(new System.IO.FileStream(pics.ToString()+".jpg", System.IO.FileMode.Create));
15         pics++;
16     }, new object[2]);
17 }

其中img1是图像控件。

此方法显示视频时,如果帧率过高(测试时打开了一个AVI文件,读取帧的时候没有延时)则图像会闪黑屏。一开始怀疑是C++部分程序多线程同步问题,后来加入了第12~15行代码,将C#收到的图像保存下来,结果图片完全没问题,就是image控件显示时出现了黑屏情况。经调试无效后,决定使用winform的图像控件。

首先在工程中引用:

  System.Windows.Froms

  WindowsFormsIntegration

然后在xaml中添加:

  xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"

  xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

在控件处添加:

  <WindowsFormsHost Name="windowsFormsHost1" Grid.Row="1" Grid.Column="0">
    <wf:PictureBox Name="picturebox1"/>
  </WindowsFormsHost>

在C#代码中添加:

  public System.Windows.Forms.PictureBox picb1;

初始化时添加:

  picb1 = windowsFormsHost1.Child as System.Windows.Forms.PictureBox;

显示代码:

1 while (true)
2 {
3     S_IMG simg = Mingw.display(); //调用取图像函数
4     Dispatcher.Invoke((EventHandler)delegate
5     {
6         System.Drawing.Bitmap bitmap=new Bitmap(simg.w,simg.h,simg.w*3,System.Drawing.Imaging.PixelFormat.Format24bppRgb,simg.pbuf);
7         picb1.Image=bitmap;
8     }, new object[2]);
9 }

就不闪了,代码也清爽多了。不过wpf和winform的图像像素格式是反的,分不清哪个是RGB哪个是BGR了。

时间: 2024-08-05 04:18:59

wpf显示视频,image控件闪屏,使用winform控件实现的相关文章

Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)

本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力. 首先看一下效果图吧, 原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label用来分别显示进度和进度信息,而Dialog的宽度和高度正是闪屏图片的宽度和高度.然后将闪屏图片贴到Dialog中作为整个窗体的背景,Dialog显示时覆盖闪屏所处的区域.由于Dialog显示时闪屏并没有消失,且Dialog的X.Y及宽高都与闪屏图片一致,因此实际切换时,非常流畅,用户感觉不到有异常,

子对话框 TextControl 控件画坐标闪屏的问题

在子对话框的TextControl控件中画了坐标轴并填充的底色,一开始在 OnInit()中重绘textcontrol控件显示不出坐标轴,百度之,重写PreTranslateMessage函数搞定,但是存在闪屏问题,只要鼠标动就会闪屏,也找不到好的解决办法,最后设置了一个flag,控制PreTranslateMessage函数的执行次数得以解决问题.重写Onpaint和双缓冲技术连现实都显示不出来,不知道为什么.有更好解决办法的留言给个建议,谢谢. int flag=1;//控制PreTrans

C# WinForm中 让控件全屏显示的实现代码

夏荣全 ( lyout(at)163.com )原文 C#中让控件全屏显示的实现代码(WinForm) 有时候需要让窗口中某一块的内容全屏显示,比如视频播放.地图等等.经过摸索,暂时发现两种可行方法,如果有谁知道其他方法,敬请告知 1.使用winapi “SetParent” 接口: [DllImport("user32.dll", SetLastError = true)] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr

android mediaplayer VideoPlayerManager 加载视频闪屏问题排查解决

Android VideoPlayer 在滚动列表实现item视频播放(ListView控件和RecyclerView),在列表滚动时点击屏幕列表暂停,在item视频播放区域,视频播放时会出现闪屏问题. 排查解决,VideoPlayerManager->MediaPlayerWrapper.java->prepare() :                     { .prepareAsync().set(State.)(!= ) {                             

C# WPF 低仿网易云音乐(PC)歌词控件

原文:C# WPF 低仿网易云音乐(PC)歌词控件 提醒:本篇博客记录了修改的过程,废话比较多,需要项目源码和看演示效果的直接拉到文章最底部~ 网易云音乐获取歌词的api地址 http://music.163.com/api/song/media?id=歌曲ID 填写歌曲的id即可获取到json格式的数据(歌曲ID获取的方法是:点击分享按钮>其他分享>复制链接,就可以在链接中看到了): {"songStatus":0,"lyricVersion":10,

Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间.成本等因素,往往难免会碰到在WPF中使用Winfrom控件的问题,我们知道Wpf可以通过使用WindowsFormsHost容器调用Winform控件,但是在一些场合需要将Wpf元素显示在Winform控件的上层,此时就会出现Wpf元素被Winform控件遮盖的问题. 一.场景再现 接到公司命令,在时间紧迫的情况下,需要将原来的Winform程序(

winfrom实现控件全屏效果

用常规方法实现全屏显示时,由于采用的三方控件导致界面顶端一直有一条半透明的类似标题栏的东西无法去除,原因一直没找到. 下面综合整理下网上两位博主的用WindowsAPI实现全屏的方法: 控件全屏显示: http://www.cnblogs.com/lmcblog/archive/2012/07/14/2591501.html 任务栏.开始菜单栏显示隐藏:http://www.cnblogs.com/ITBread/p/3503801.html 我把代码整理下,方便下次自己查看 1.任务栏.菜单栏

WPF 调用WinForm控件

WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置winHost1.Child属性为你要显示的WinForm控件. 使用WindowsFormsHost显示WinForm控件时会有一个显示风格问题: 设计时的模样如图-1       图-1 显示效果如图-2 图-2 在Main()函数里面添加System.Windows.Forms.Applicatio

【IOS界面布局】横竖屏切换和控件自适应(推荐)

[IOS界面布局]横竖屏切换和控件自适应(推荐) 分类: [MAC/IOS下开发]2013-11-06 15:14 8798人阅读 评论(0) 收藏 举报 横竖屏切换 自适应 第一种:通过人为的办法改变view.transform的属性. 具体办法: view.transform一般是View的旋转,拉伸移动等属性,类似view.layer.transform,区别在于 View.transform是二维的,也就是使用仿射的办法通常就是带有前缀CGAffineTransform的类(可以到API