2011-07-18 61 views
0

首先,我想向社区问好。我一直是这个地方的长期潜伏者和欣赏者。在WPF中绘制视频的方法

现在,我正在研究一个包含Aforge库的个人运动检测程序,该程序强烈基于Andrew Kirillov的教程http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx?fid=177045&fr=26#xx0xx。顺便说一下,我会强烈建议任何对此主题感兴趣的人。现在到了。这个项目是使用winforms构建的,我使用WPF重新创建了我自己的版本(比特,片断和附加),并且遇到了问题。有一个部分,Andrew使用了OnPaint函数,并且我正在努力如何处理wpf中的绘图。这里是他的代码(可能有小的改动)

// Paint control 
    protected override void OnPaint(PaintEventArgs pe) 
    { 

     // lock 
     Monitor.Enter(this); 

     var g = pe.Graphics; 
     var rc = ClientRectangle; 
     var pen = new Pen(m_RectColor, 1); 

     // draw rectangle 
     g.DrawRectangle(pen, rc.X, rc.Y, rc.Width - 1, rc.Height - 1); 

     if (m_Camera != null) 
     { 
      try 
      { 
       m_Camera.Lock(); 

       // draw frame 
       g.DrawImage(m_Camera.LastFrame, rc.X + 1, rc.Y + 1, rc.Width - 2, rc.Height - 2); 
      } 
      catch (Exception) { } 
      finally 
      { 
       m_Camera.Unlock(); 
      } 
     } 
     pen.Dispose(); 

     // unlock 
     Monitor.Exit(this); 
     base.OnPaint(pe); 
    } 

为了提供更多的见解,m_Camera.LastFrame是一个位图。

经过一番研究,我发现有一个可用的渲染函数,但似乎没有人关心它,很大程度上是因为效率。我还考虑过分配建立图像和分配位图作为源的可能性,但这对我来说并不适用。任何意见,将不胜感激。如果需要更多信息/代码,请告诉我。谢谢!

丹尼尔

回答

0

您可以使用WPF渲染上下文的DrawingVisual中,你已经显示了的WinForms准确地绘制。主要的区别是在WPF中它仍然不是即时模式绘图。所有呈现上下文绘图都会被记录,就像所有其他WPF操作都按照计划呈现一样。为了我的目的,它运行良好,但我不确定你会看到视频的良好性能。正如你所提到的,你也可以分配一个位图。我不知道为什么这不适合你。也许你需要一些UpdateLayout调用来强制更新显示?

另一种方法是使用WriteableBitmap,但同样,这不是即时模式绘图,因为在WPF中没有即时模式绘图。尽管如此,我还是获得了不错的表现,其中包括动画。

最后,您可以使用WPF处理除视频表面以外的所有内容,并使用Winforms主机托管视频面板。大多数WPF功能在Winforms主机上工作得很好,主要的例外是天桥。

+0

感谢您的迅速和整个答复。我会继续努力,让每个人都知道最好的解决方案是什么。 – Daniel