2010-09-20 19 views
11

Estoy haciendo una aplicación que permitirá a los usuarios aplicar ciertas herramientas para analizar imágenes de videos &. 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 en Advance,Dibujando en Video dentro de C#

Chris :)

+1

Ver mi nueva edición: siempre puede usar WPF para la ventana de edición de video y WinForms para el resto de su aplicación. –

Respuesta

2

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

No conozco ninguna forma de dibujar realmente en 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 WMP)

Sin embargo, como paneles transparentes reales son también bastante complicado en WinForms, otra forma sería la de tomar una imagen del vídeo y dibujar la imagen superpuesta en . De nuevo, solo cuando está en pausa.

This 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 prueba de dibujo sobre el WMP usando un panel transparente y su no se comporta como lo hizo mi control tercera parte, por lo que sugiero que hagas el video jugando poco en WPF y host that in your winforms app. (Yo también probé eso usando la sugerencia @Callums inkcanvas y funciona como un amuleto)

+0

Gracias, pero ¿cómo hago esta técnica de poner un WPF en un WinForm? ¿O necesito deshacerme de él por completo y simplemente rehacerlo en WPF? pero si hay una forma en que no tengo que eliminar y cambiar mi proyecto a WPF, sería ideal :) –

+0

@Chris: puedes poner un control WinForm en WPF pero no al revés. –

+1

@Callum - No es cierto: puede alojar un control wpf dentro de una aplicación de winforms: http://msdn.microsoft.com/en-us/library/system.windows.forms.integration.elementhost.aspx –

1

Si utiliza WPF, tratar anplacingInkCanvas en la cima de su vídeo y el establecimiento de la. Background a 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 vídeo:

alt text

sospecho que pueda estar usando Windows Forms sin embargo, que esto puede ser más difícil. Si es así, ¡una buena excusa para aprender WPF!


EDIT: Con Windows Forms, que tendría que hacer su propio control personalizado que actúa como una capa transparente y añadir pinceladas a ella. 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 interfaz de usuario de su aplicación. WPF funciona en XP y arriba.


Edit2: Tras Google, hay algunos InkCanvas equivalents que la gente ha hecho para Windows Forms, pero no tengo ni idea de lo buenos que son y no pueden apoyar 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.

+0

Entonces, ¿qué debo hacer porque lo estoy haciendo en un WinForm en XP? –

-2

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 :-)

+0

Silverlight es solo un subconjunto de WPF que está diseñado para ser utilizado con páginas web. –

+0

¿No sigo? Por favor, consulte http://wpfslguidance.codeplex.com/releases/view/30311. No es solo un subconjunto de WPF, una de las principales diferencias es lo fácil que es distribuir aplicaciones de Silverlight a través de la Web. Consulte el soporte de superposición de video en Silverlight para obtener más información. –

+0

@Chris ya tiene una aplicación de winforms existente en la que quiere esta funcionalidad. ¿Cómo lo soluciona Silverlight? También SL no puede ejecutarse con plena confianza (elevado-sí, pero no completo) y SL MediaElement solo puede reproducir WMV VC-1 o video h.264 de fábrica. WMP o WPF MediaPlayer pueden reproducir cualquier video para el que el usuario tenga instalados códecs. –

0

lo podría hacer en XNA (www.xna.com) de Microsoft. Está hecho para lenguajes administrados como C# y debe support video.

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

También debería tener en cuenta 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 al diseño time.

0

He encontrado cómo hacerlo.
Esta es una manera en WPF usando lienzo

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

a continuación, crear eventos de ratón de la lona y dibujar 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); 
} 
1

Esto se puede hacer en Windows Forms, 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#layered.

Ponga un formulario transparente encima de su control de video y puede dibujar lo que desee 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í un poco de este ejemplo: http://www.codeproject.com/Articles/13558/AlphaGradientPanel-an-extended-panel.