首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中的视频上绘图

在C#中的视频上绘图
EN

Stack Overflow用户
提问于 2010-09-20 21:41:05
回答 6查看 8.5K关注 0票数 11

我正在制作一个应用程序,将允许用户应用某些工具来分析视频和图像。我需要帮助我如何在窗体中加载到windows media player中的视频上实际绘制/写入,并能够将其保存在窗体上。它需要能够让用户绘制手绘和形状上它。提前谢谢你,

Chris :)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-20 22:21:37

这不是一个简单的任务,如果不是不可能完成的话,在winforms中使用wmp控件。

我不知道有什么方法可以在wmp上绘制,但你可以在覆盖在wmp上的透明面板上绘制。在播放视频时,这将不起作用,但您可以在暂停时显示绘图。我使用这个技术来绘制一个第三方视频控件,它的工作方式类似于wmp。(编辑-这似乎不适用于wmp控件)

然而,由于真正的透明面板在winforms中也相当棘手,另一种方法是从视频中抓取图像并在覆盖的图像上绘制。同样,只有当它暂停的时候。

This商业控件支持在视频上进行绘制。它有一个事件,可以触发你可以用来绘制的每一帧。然而,最大的缺点是,你不能真的做任何太花哨的事情,因为你的绘图例程需要在绘制下一个帧之前完成。

我强烈建议您使用wpf (即使它是一个托管在winforms应用程序中的wpf控件)来显示您的视频。在wpf中绘制视频(包括播放视频)要容易得多。

编辑

我刚刚测试了一下使用透明面板在wmp上的绘制,它的表现和我的第三方控件不一样,所以我建议你在WPF和 中做视频播放。(我刚刚使用@Callum inkcanvas建议对其进行了测试,它的效果很不错)

票数 2
EN

Stack Overflow用户

发布于 2010-09-20 22:10:32

如果您使用的是WPF,请尝试在视频上添加placing an InkCanvas,并将Background设置为透明。然后,您可以保存并加载用户在视频顶部绘制的形状。

使用图片而不是视频进行一些概念验证:

不过,我怀疑您可能正在使用WinForms,这可能会更加困难。如果是这样,那就是学习WPF的好借口!

编辑:使用WinForms,你必须制作你自己的自定义控件,作为一个透明的覆盖,并在其中添加画笔笔触。它很难很好地实现(使用透明的背景,这在WinForms中不能很好地发挥作用)。我建议您使用WPF,如果您仍处于可以更改应用程序UI的阶段。WPF可以在XP和更高版本上运行。

EDIT2:在谷歌搜索之后,人们为WinForms制作了一些InkCanvas equivalents,但我不知道它们有多好,可能不支持透明背景。

你可以在新的窗口中添加你想要批注的视频,而在WinForms中放置应用程序的其余部分。

票数 1
EN

Stack Overflow用户

发布于 2012-12-06 12:33:47

我已经找到了如何做到这一点。

以下是WPF中使用画布的一种方法

代码语言:javascript
复制
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();
    }
}

然后为画布创建鼠标事件并使用它进行绘制

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3752016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档