首先,我想向社区问好。我一直是这个地方的潜伏者和赞赏者。
现在,我正在开发一个包含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是一个位图。
在做了一些研究后,我发现有一个可用的函数,但由于效率,似乎没有人关心它。我还考虑过分配建立图像并将位图指定为源的可能性,但这对我来说并不奏效。任何意见,将不胜感激。如果需要更多信息/代码,请告诉我。谢谢!
丹尼尔
答案 0 :(得分:0)
您可以在DrawingVisual中使用WPF渲染上下文,以您为Winforms显示的确切方式进行绘制。主要区别在于,在WPF中,它仍然不是立即模式绘制。所有渲染上下文绘制都被记录,就像所有其他WPF操作一样,并按计划呈现。为了我的目的,它运作良好但我不确定你会看到视频的良好表现。
如您所述,您也可以指定位图。我不确定为什么那不适合你。也许您需要一些UpdateLayout调用来强制更新显示?
另一种方法是使用WriteableBitmap,但同样,这不是立即模式绘制,因为WPF中没有立即模式绘制。不过,我的表现确实不错,包括动画。
最后,您可以将WPF用于除视频表面之外的所有内容,并使用Winforms主机托管您的视频面板。大多数WPF功能在Winforms主机上运行得很好,主要的例外是天桥。