我正在制作一个应用程序,将允许用户应用某些工具来分析视频和图像。我需要帮助我如何在窗体中加载到windows media player中的视频上实际绘制/写入,并能够将其保存在窗体上。它需要能够让用户绘制手绘和形状上它。提前谢谢你,
Chris :)
发布于 2010-09-20 22:21:37
这不是一个简单的任务,如果不是不可能完成的话,在winforms中使用wmp控件。
我不知道有什么方法可以在wmp上绘制,但你可以在覆盖在wmp上的透明面板上绘制。在播放视频时,这将不起作用,但您可以在暂停时显示绘图。我使用这个技术来绘制一个第三方视频控件,它的工作方式类似于wmp。(编辑-这似乎不适用于wmp控件)
然而,由于真正的透明面板在winforms中也相当棘手,另一种方法是从视频中抓取图像并在覆盖的图像上绘制。同样,只有当它暂停的时候。
This商业控件支持在视频上进行绘制。它有一个事件,可以触发你可以用来绘制的每一帧。然而,最大的缺点是,你不能真的做任何太花哨的事情,因为你的绘图例程需要在绘制下一个帧之前完成。
我强烈建议您使用wpf (即使它是一个托管在winforms应用程序中的wpf控件)来显示您的视频。在wpf中绘制视频(包括播放视频)要容易得多。
编辑
我刚刚测试了一下使用透明面板在wmp上的绘制,它的表现和我的第三方控件不一样,所以我建议你在WPF和 中做视频播放。(我刚刚使用@Callum inkcanvas建议对其进行了测试,它的效果很不错)
发布于 2010-09-20 22:10:32
如果您使用的是WPF,请尝试在视频上添加placing an InkCanvas,并将Background设置为透明。然后,您可以保存并加载用户在视频顶部绘制的形状。
使用图片而不是视频进行一些概念验证:

不过,我怀疑您可能正在使用WinForms,这可能会更加困难。如果是这样,那就是学习WPF的好借口!
编辑:使用WinForms,你必须制作你自己的自定义控件,作为一个透明的覆盖,并在其中添加画笔笔触。它很难很好地实现(使用透明的背景,这在WinForms中不能很好地发挥作用)。我建议您使用WPF,如果您仍处于可以更改应用程序UI的阶段。WPF可以在XP和更高版本上运行。
EDIT2:在谷歌搜索之后,人们为WinForms制作了一些InkCanvas equivalents,但我不知道它们有多好,可能不支持透明背景。
你可以在新的窗口中添加你想要批注的视频,而在WinForms中放置应用程序的其余部分。
发布于 2012-12-06 12:33:47
我已经找到了如何做到这一点。
以下是WPF中使用画布的一种方法
private void buttonPlayVideo_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
dlg.Filter = "All Files|*.*";
Nullable<bool> result = dlg.ShowDialog();
if (result == true) {
MediaPlayer mp = new MediaPlayer();
mp.Open(new Uri(filename));
VideoDrawing vd = new VideoDrawing();
vd.Player = mp;
vd.Rect = new Rect(0, 0, 960, 540);
DrawingBrush db = new DrawingBrush(vd);
canvas.Background = db;
mp.Play();
}
}
然后为画布创建鼠标事件并使用它进行绘制
Point startPoint, endPoint;
private void canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(canvas);
}
private void canvas_MouseUp(object sender, MouseButtonEventArgs e)
{
endPoint = e.GetPosition(canvas);
Line myLine = new Line();
myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
myLine.X1 = startPoint.X;
myLine.Y1 = startPoint.Y;
myLine.X2 = endPoint.X;
myLine.Y2 = endPoint.Y;
myLine.HorizontalAlignment = HorizontalAlignment.Left;
myLine.VerticalAlignment = VerticalAlignment.Center;
myLine.StrokeThickness = 2;
canvas.Children.Add(myLine);
}https://stackoverflow.com/questions/3752016
复制相似问题