0

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

现在,我正在开发一个包含 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 是一个位图。

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

丹尼尔

4

1 回答 1

0

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

正如您所提到的,您也可以分配位图。我不确定为什么这对你不起作用。也许您需要一些 UpdateLayout 调用来强制显示更新?

另一种方法是使用 WriteableBitmap,但同样,这不是即时模式绘图,因为 WPF 中没有即时模式绘图。不过,我确实从中获得了不错的性能,包括动画。

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

于 2011-07-18T21:58:33.417 回答