在WPF中绘制视频Feed的方法

时间:2011-07-18 20:15:28

标签: wpf video bitmap onpaint

首先,我想向社区问好。我一直是这个地方的潜伏者和赞赏者。

现在,我正在开发一个包含Aforge库的个人运动检测程序,并且基于Andrew Kirillov的教程http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx?fid=177045&fr=26#xx0xx。顺便说一句,我强烈建议任何对该主题感兴趣的人。现在到了这一点。这个项目是使用winforms构建的,我正在使用WPF重新创建我自己的版本(位,部分和添加),我遇到了一个问题。安德鲁有一个部分使用了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是一个位图。

在做了一些研究后,我发现有一个可用的函数,但由于效率,似乎没有人关心它。我还考虑过分配建立图像并将位图指定为源的可能性,但这对我来说并不奏效。任何意见,将不胜感激。如果需要更多信息/代码,请告诉我。谢谢!

丹尼尔

1 个答案:

答案 0 :(得分:0)

您可以在DrawingVisual中使用WPF渲染上下文,以您为Winforms显示的确切方式进行绘制。主要区别在于,在WPF中,它仍然不是立即模式绘制。所有渲染上下文绘制都被记录,就像所有其他WPF操作一样,并按计划呈现。为了我的目的,它运作良好但我不确定你会看到视频的良好表现。

如您所述,您也可以指定位图。我不确定为什么那不适合你。也许您需要一些UpdateLayout调用来强制更新显示?

另一种方法是使用WriteableBitmap,但同样,这不是立即模式绘制,因为WPF中没有立即模式绘制。不过,我的表现确实不错,包括动画。

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