Рисование на видео в C # - PullRequest
       8

Рисование на видео в C #

11 голосов
/ 20 сентября 2010

Я делаю приложение, которое позволит пользователям применять определенные инструменты для анализа видео и изображений. Мне нужна помощь с тем, как я на самом деле рисую / пишу видео, загруженное в Windows Media Player в моей форме, и могу сохранить его Он должен уметь рисовать от руки и фигуры. Заранее спасибо,

Крис:)

Ответы [ 6 ]

2 голосов
/ 20 сентября 2010

Это нетривиальная, если не невозможная задача, которую можно выполнить с помощью wmp control в winforms.

Я не знаю, как на самом деле рисовать на wmp, но вы могли бы нарисовать прозрачную панель, наложенную поверх wmp. Это не будет работать, если видео воспроизводится, но вы можете показать чертеж, пока он приостановлен. Я использовал эту технику для отрисовки стороннего элемента управления видео, который работает аналогично wmp. (Редактировать - похоже, это не работает с элементом управления wmp)

Однако, поскольку настоящие прозрачные панели также довольно сложны в формах win, другим способом было бы извлечь изображение из видео и нарисовать наложенное изображение. Опять же, только когда это приостановлено.

Этот коммерческий элемент управления позволяет рисовать видео. У него есть событие, которое запускает каждый кадр, который вы можете использовать для рисования. Однако, большим недостатком является то, что вы не можете сделать что-то слишком причудливое, поскольку ваша процедура рисования должна закончиться до того, как будет нарисован следующий кадр.

Я бы настоятельно рекомендовал вам использовать WPF (даже если это элемент управления wpf, размещенный в приложении winforms) для показа вашего видео. На wpf намного проще рисовать видео (включая воспроизведение видео).

EDIT

Я только что протестировал рисование поверх wmp с использованием прозрачной панели, и оно не работает как мой сторонний элемент управления, поэтому я предлагаю вам сделать бит воспроизведения видео в WPF и host, который в ваших winforms приложение . (Я только что проверил это, используя предложение @Callums inkcanvas, и оно работает как шарм)

1 голос
/ 10 марта 2014

Это можно сделать в WinForms, но это нелегко. В WinForms есть прозрачная поддержка форм с альфа-смешиванием. Используйте следующие CreateParams для прозрачной оверлейной формы: WS_EX_LAYERED, WS_EX_TRANSPARENT. Проверьте ссылки MSDN для этого типа окна: http://msdn.microsoft.com/en-us/library/ms997507.aspx, http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#layered.

Поместите прозрачную форму над элементом управления видео, и вы можете нарисовать на нем все, что захотите События перемещения и изменения размера должны быть скоординированы между вашим видеоокном и прозрачной формой над ним. Для перерисовки наложения необходимо использовать UpdateLayeredWindow () в user32.dll.

Из этого примера я многому научился: http://www.codeproject.com/Articles/13558/AlphaGradientPanel-an-extended-panel.

1 голос
/ 20 сентября 2010

Если вы используете WPF, попробуйте , поместив InkCanvas поверх вашего видео и установив прозрачность Background. Затем вы можете сохранить и загрузить формы, которые пользователи рисуют поверх видео.

Небольшое подтверждение концепции с изображением вместо видео:

alt text

Я подозреваю, что вы можете использовать WinForms, хотя это может быть более трудным. Если это так, хороший повод для изучения WPF!


РЕДАКТИРОВАТЬ: С WinForms вам придется создать свой собственный элемент управления, который действует как прозрачное наложение и добавить мазки кисти к нему. Это было бы чрезвычайно сложно реализовать хорошо (с прозрачным фоном, который не очень хорошо WinForms). Я бы порекомендовал использовать WPF, если вы все еще находитесь на этапе, когда вы можете изменить пользовательский интерфейс своего приложения. WPF работает на XP и выше.


EDIT2: После поиска в Google есть эквивалентов InkCanvas , которые люди сделали для WinForms, но я понятия не имею, насколько они хороши и могут не поддерживать прозрачный фон.

Вы всегда можете разместить видео, которое вы хотите аннотировать, в новом окне WPF, а остальную часть вашего приложения - в WinForms.

0 голосов
/ 06 декабря 2012

Я нашел, как это сделать.
Вот один способ в WPF с использованием Canvas

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();
    }
}

, затем создать события мыши для Canvas и рисовать с ним

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);
}
0 голосов
/ 21 сентября 2010

Вы можете посмотреть на XNA (www.xna.com) от Microsoft.Он сделан для управляемых языков, таких как c #, и должен поддерживать видео .

Я использовал его только для рисования в c #, но он выполняет свою работу.Следует также отметить, что XNA будет функционировать как часть обычного приложения Windows Forms.Что бы это ни стоило, я также прототипировал нечто подобное с помощью Flash;Flash позволяет импортировать каждый кадр файла фильма в редактор и создавать SWF-файл, который может реагировать на взаимодействие с пользователем.

Однако этот подход бесполезен, если вам нужно обновить фильм в режиме реального времени.Flash (последний раз, когда я проверял) может импортировать фильм только в design time.

0 голосов
/ 20 сентября 2010

Хорошо, безусловно, лучший способ сделать это - использовать Silverlight. Silverlight поддерживает все основные форматы потоковой передачи, а также обеспечивает полный доступ к кадровому буферу.

Легко: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...