2010-09-20 44 views
11

Je fais une application qui permettra aux utilisateurs d'appliquer certains outils pour analyser les vidéos & images. J'ai besoin d'aide avec comment je dessine/écrit actaully sur la vidéo chargée dans Windows Media Player dans mon formulaire et être en mesure de l'enregistrer. Il doit être capable d'attirer l'utilisateur à dessiner à main levée et de façonner des formes. Merci à l'avance,Dessin sur vidéo dans C#

Chris :)

+1

Voir ma nouvelle édition: Vous pouvez toujours utiliser WPF pour la fenêtre d'édition vidéo et WinForms pour le reste de votre application. –

Répondre

2

Il s'agit d'une tâche non triviale, voire impossible à accomplir avec le contrôle wmp dans les winforms.

Je ne connais aucun moyen de dessiner réellement sur le wmp, mais vous pouvez dessiner sur un panneau transparent superposé sur le wmp. Cela ne fonctionnera pas si la vidéo est en cours de lecture mais vous pouvez afficher le dessin pendant qu'il est en pause. J'ai utilisé cette technique pour dessiner un contrôle vidéo tiers qui fonctionne de manière similaire à wmp. (Edit - cela ne semble pas fonctionner avec le contrôle WMP)

Cependant, comme les panneaux réels transparents sont également assez délicate dans WinForms, une autre façon serait de saisir une image de la vidéo et d'en tirer sur l'image superposée . Encore une fois, seulement quand il est en pause.

This Le contrôle commercial permet le dessin sur la vidéo. Il a un événement qui déclenche chaque image que vous pouvez utiliser pour faire le dessin. Le gros inconvénient, cependant, c'est que vous ne pouvez pas vraiment faire quelque chose de trop chic car votre routine de dessin doit se terminer avant la prochaine image est tirée.

Je vous encourage fortement à utiliser WPF (même si c'est un contrôle wpf hébergé dans une application winforms) pour montrer votre vidéo. Il est beaucoup plus facile de dessiner sur vidéo (y compris la lecture de vidéo) en wpf.

EDIT

Je dessin viens de tester sur le wmp en utilisant un panneau transparent et son ne se comporte pas comme mon contrôle 3e parti a fait, je vous suggère de faire le bit lecture vidéo dans WPF et host that in your winforms app. (Je viens de tester cela aussi en utilisant @Callums inkcanvas suggestion et cela fonctionne comme un charme)

+0

Merci, mais comment puis-je faire cette technique de mettre un WPF dans un WinForm? Ou dois-je m'en débarrasser complètement et le refaire sur WPF? mais s'il y a une façon dont je ne dois pas supprimer et changer mon projet en WPF alors ce serait idéal :) –

+0

@Chris: Vous pouvez mettre un contrôle WinForm dans WPF mais pas l'inverse. –

+1

@Callum - Pas vrai - vous pouvez héberger un contrôle wpf dans une application winforms: http://msdn.microsoft.com/fr-fr/library/system.windows.forms.integration.elementhost.aspx –

1

Si vous utilisez WPF, essayez placinganInkCanvas au-dessus de votre vidéo et le réglage du Background à la transparence. Vous pouvez ensuite enregistrer et charger les formes que les utilisateurs dessinent en haut de la vidéo.

Un peu de preuve de concept avec une image au lieu d'une vidéo:

alt text

Je suppose que vous pouvez utiliser WinForms cependant, où cela peut être plus difficile. Si oui, une bonne excuse pour apprendre WPF!


EDIT: Avec WinForms, vous devez faire votre propre contrôle personnalisé qui agit comme une superposition transparente et ajouter des coups de pinceau à elle. Il serait extrêmement difficile à bien implémenter (avec un fond transparent, qui ne joue pas bien avec WinForms). Je recommanderais d'utiliser WPF si vous en êtes encore à un stade où vous pouvez modifier l'interface utilisateur de votre application. WPF fonctionne sur XP et plus.


EDIT2: Après googler, il y a quelques InkCanvas equivalents que les gens ont fait pour WinForms, mais je ne sais pas à quel point ils sont et ne peuvent pas soutenir un fond transparent.

Vous pouvez toujours avoir la vidéo que vous souhaitez annoter dans une nouvelle fenêtre WPF et le reste de votre application dans WinForms.

+0

Alors que dois-je faire parce que je le fais sur un WinForm sous XP? –

-2

Ok, de loin, la meilleure façon de le faire est d'utiliser Silverlight. Silverlight prend en charge tous les principaux formats de streaming et fournit également un accès complet au framebuffer.

facile :-)

+0

Silverlight est un sous-ensemble de WPF conçu pour être utilisé avec des pages Web. –

+0

Je ne suis pas? S'il vous plaît voir http://wpfslguidance.codeplex.com/releases/view/30311. Ce n'est pas seulement un sous-ensemble de WPF, une fois des différences majeures est la facilité de distribuer des applications Silverlight via le Web. Voir le support de superposition vidéo dans Silverlight pour plus d'informations. –

+0

@Chris a déjà une application winforms existante dans laquelle il veut cette fonctionnalité po Comment Silverlight résoudre cela? De même, SL ne peut pas s'exécuter en toute confiance (valeur élevée-oui mais pas complète) et SL MediaElement ne peut lire que des vidéos WMV VC-1 ou h.264. WMP ou WPF MediaPlayer peut lire n'importe quelle vidéo pour laquelle l'utilisateur a installé des codecs. –

0

Vous pouvez regarder XNA (www.xna.com) de Microsoft. Il est fait pour les langages gérés comme C# et devrait support video.

Je l'ai seulement utilisé pour dessiner en C#, mais cela fait le travail.

Je devrais également noter que XNA fonctionnera dans le cadre d'une application Windows Forms régulière. Pour ce que ça vaut, j'ai aussi prototypé quelque chose comme ça avec Flash; Flash vous permet d'importer chaque image du fichier vidéo dans l'éditeur et de créer un fichier SWF capable de répondre aux interactions de l'utilisateur. Cependant, cette approche est inutile si vous avez besoin de mettre à jour le film en temps réel. Flash (dernière fois j'ai vérifié) ne pouvait qu'importer le film au design fois.

0

J'ai trouvé comment faire cela.
Voici une façon WPF utilisant 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(); 
    } 
} 

puis créer des événements de souris pour toile et dessiner avec elle

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

Cela peut être fait en WinForms, mais il est pas facile. Il existe un support de formulaire transparent avec le mélange alpha dans WinForms. Utilisez CreateParams suivant pour le formulaire de superposition transparent: WS_EX_LAYERED, WS_EX_TRANSPARENT. Vérifiez les références MSDN pour ce type de fenêtre: http://msdn.microsoft.com/en-us/library/ms997507.aspx, http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#layered. Mettez un formulaire transparent au-dessus de votre contrôle vidéo et vous pouvez dessiner tout ce que vous voulez dessus. Les événements de déplacement et de redimensionnement doivent être coordonnés entre votre fenêtre vidéo et le formulaire transparent situé au-dessus. Redessiner l'overlay doit utiliser UpdateLayeredWindow() dans user32.dll.

J'ai appris pas mal de cet exemple: http://www.codeproject.com/Articles/13558/AlphaGradientPanel-an-extended-panel.