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

时间:2021-10-09 08:42:54

使用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 Grid.Row="1" Grid.Column="0">
    <wf:PictureBox/>
  </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了。

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