c# image video drawing shapes

Dibujando en video dentro de C#



image drawing (6)

Estoy haciendo una aplicación que permitirá a los usuarios aplicar ciertas herramientas para analizar videos e imágenes. Necesito ayuda con la forma de dibujar / escribir en el video cargado en Windows Media Player dentro de mi formulario y poder guardarlo. Tiene que ser capaz de ayudar al usuario a dibujar a mano alzada y las formas en él. Gracias por adelantado,

Chris :)


Esta es una tarea no trivial, si no imposible, de lograr con el control de wmp en winforms.

No sé de ninguna manera para dibujar en realidad la WMP, pero podría dibujar sobre un panel transparente superpuesto sobre la WMP. Esto no funcionará si el video se está reproduciendo, pero puede mostrar el dibujo mientras está en pausa. He usado esta técnica para dibujar sobre un control de video de un tercero que funciona de manera similar a wmp. (Editar - esto no parece funcionar con el control de wmp)

Sin embargo, como los paneles transparentes reales también son bastante difíciles en las formas de ganar, otra forma sería tomar una imagen del video y dibujar en la imagen superpuesta. De nuevo, solo cuando está en pausa.

Este control comercial permite dibujar sobre el video. Tiene un evento que dispara cada cuadro que puedes usar para hacer el dibujo. El gran inconveniente, sin embargo, es que no se puede hacer nada demasiado sofisticado ya que su rutina de dibujo necesita terminar antes de que se dibuje el siguiente cuadro.

Le recomiendo que use WPF (incluso si es un control wpf alojado en una aplicación de winforms) para mostrar su video. Es mucho más fácil dibujar en video (incluido reproducir video) en wpf.

EDITAR

Acabo de probar el dibujo sobre el wmp con un panel transparente y no se comporta como lo hizo mi control de terceros, por lo que te sugiero que hagas el video reproducido en WPF y lo alojes en tu aplicación de winforms . (Acabo de probar eso también con la sugerencia @Callums inkcanvas y funciona como un amuleto)


Esto se puede hacer en WinForms pero no es fácil. Hay compatibilidad de formulario transparente con mezcla alfa en WinForms. Use los siguientes CreateParams para el formulario de superposición transparente: WS_EX_LAYERED, WS_EX_TRANSPARENT. Consulte las referencias de MSDN para este tipo de ventana: http://msdn.microsoft.com/en-us/library/ms997507.aspx , http://msdn.microsoft.com/en-us/library/ms632599%28VS. 85% 29.aspx # en capas .

Coloca un formulario transparente encima de tu control de video y puedes dibujar cualquier cosa que quieras en él. Los eventos de movimiento y cambio de tamaño deben coordinarse entre su ventana de video y el formulario transparente sobre ella. Para volver a dibujar la superposición debe usar UpdateLayeredWindow () en user32.dll.

Aprendí bastante de este ejemplo: http://www.codeproject.com/Articles/13558/AlphaGradientPanel-an-extended-panel .


He encontrado cómo hacer esto.
Aquí hay una forma en WPF usando 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(); } }

luego crea eventos de mouse para Canvas y dibuja con él

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


Ok, de lejos, la mejor manera de hacerlo es usar Silverlight. Silverlight admite todos los principales formatos de transmisión y también proporciona acceso completo al framebuffer.

Fácil :-)


Puede consultar XNA (www.xna.com) de Microsoft. Está hecho para lenguajes administrados como c # y debe ser compatible con video .

Solo lo he usado para dibujar en c #, pero hace el trabajo bien.

También debo señalar que XNA funcionará como parte de una aplicación regular de Windows Forms. Por lo que vale, también he creado prototipos de algo como esto con Flash; Flash le permite importar cada fotograma del archivo de película en el editor y crear un archivo SWF que pueda responder a la interacción del usuario.

Sin embargo, este enfoque es inútil si necesita actualizar la película en tiempo real. Flash (la última vez que revisé) solo podía importar la película en el momento del diseño .


Si está utilizando WPF, intente colocar un InkCanvas en la parte superior de su video y establezca el Background en transparente. A continuación, puede guardar y cargar las formas que los usuarios dibujan en la parte superior del video.

Una pequeña prueba de concepto con una imagen en lugar de un video:

Sin embargo, sospecho que puedes estar usando WinForms, donde esto puede ser más difícil. Si es así, ¡una buena excusa para aprender WPF!

EDITAR: con WinForms, tendría que hacer su propio control personalizado que actúa como una superposición transparente y agregarle trazos de pincel. Sería extremadamente difícil de implementar bien (con fondo transparente, que no funciona bien con WinForms). Recomendaría usar WPF si aún se encuentra en una etapa en la que puede cambiar la IU de su aplicación. WPF funciona en XP y arriba.

EDIT2: Después de buscar en Google, hay algunos equivalentes de InkCanvas que las personas han creado para WinForms, pero no tengo idea de lo buenos que son y es posible que no admitan fondos transparentes.

Siempre puede tener el video que desea anotar en una nueva ventana de WPF y el resto de su aplicación en WinForms.