2010-09-20 14 views
11

sto facendo un programma che permetterà agli utenti di applicare determinati strumenti per analizzare i video & immagini. Ho bisogno di aiuto per come disegnare/scrivere sul video caricato in Windows Media Player all'interno del mio modulo e poterlo salvare. Deve essere in grado di indurre l'utente a disegnare a mano libera e forme su di esso. Grazie in anticipo,Sulla base del video all'interno di C#

Chris :)

+1

Vedere la mia nuova modifica: è sempre possibile utilizzare WPF per la finestra di modifica video e WinForms per il resto dell'applicazione. –

risposta

2

Questo è un compito non banale, se non impossibile, da eseguire con il controllo wmp in Winforms.

Non conosco alcun modo per disegnare effettivamente il wmp ma è possibile disegnare su un pannello trasparente sovrapposto al wmp. Questo non funzionerà se il video è in riproduzione ma puoi mostrare il disegno mentre è in pausa. Ho usato questa tecnica per disegnare su un controllo video di terze parti che funziona in modo simile a wmp. (Modifica - questo non sembra funzionare con il controllo WMP)

Tuttavia, come i pannelli reali trasparenti sono anche piuttosto difficile in WinForms, un altro modo sarebbe quello di catturare un'immagine dal video e disegnare l'immagine sovrapposta . Di nuovo, solo quando è in pausa.

This controllo commerciale consente di disegnare sul video. Ha un evento che attiva ogni frame che è possibile utilizzare per fare il disegno. Il grande svantaggio, però, è che non si può davvero fare nulla di stravagante dato che la routine di disegno deve finire prima che venga disegnato il fotogramma successivo.

Vorrei fortemente incoraggiare l'utente a utilizzare WPF (anche se è un controllo wpf ospitato all'interno di un'app Winforms) per mostrare il video. È molto più facile disegnare su video (incluso il video) in wpf.

EDIT

Ho appena testato disegnare il WMP utilizzando un pannello trasparente e il suo non si comporta come ha fatto il mio controllo 3rd party, quindi vi suggerisco di fare la riproduzione video bit in WPF e host that in your winforms app. (Ho appena testato anche questo utilizzando @Callums suggerimento inkcanvas e funziona come un fascino)

+0

Grazie, ma come faccio questa tecnica di mettere un WPF in un WinForm? O devo liberarmene completamente e rifarlo semplicemente su WPF? ma se c'è un modo in cui non devo cancellare e modificare il mio progetto in WPF, allora sarebbe l'ideale :) –

+0

@Chris: Puoi mettere un controllo WinForm in WPF ma non viceversa. –

+1

@Callum - Non vero - è possibile ospitare un controllo wpf all'interno di un'app winforms: http://msdn.microsoft.com/en-us/library/system.windows.forms.integration.elementhost.aspx –

1

Se si utilizza WPF, provare placinganInkCanvas sulla parte superiore del video e l'impostazione del Background a trasparente. È quindi possibile salvare e caricare le forme disegnate dagli utenti in cima al video.

Un po 'proof-of-concept con una foto al posto di un video:

alt text

Ho il sospetto che si sta utilizzando WinForms però, dove questo può essere più difficile. Se è così, una buona scusa per imparare WPF!


EDIT: Con WinForms, si dovrebbe rendere il proprio controllo personalizzato che agisce come una mascherina trasparente e aggiungere pennellate ad esso. Sarebbe estremamente difficile da implementare bene (con sfondo trasparente, che non funziona bene con WinForms). Ti consiglio di utilizzare WPF se sei ancora in una fase in cui puoi modificare l'interfaccia utente della tua applicazione. WPF funziona su XP e versioni successive.


EDIT2: Dopo googling, ci sono alcuni InkCanvas equivalents che la gente ha fatto per WinForms, ma non ho idea di quanto sono bravi e non possono supportare sfondi trasparenti.

Si può sempre avere il video che si desidera annotato in una nuova finestra WPF e il resto della propria applicazione in WinForms.

+0

Quindi cosa dovrei fare perché lo sto facendo su un WinForm in XP? –

-2

Ok, di gran lunga il modo migliore per farlo è usare Silverlight. Silverlight supporta tutti i principali formati di streaming e fornisce anche l'accesso completo al framebuffer.

facile :-)

+0

Silverlight è solo un sottoinsieme di WPF progettato per essere utilizzato con le pagine Web. –

+0

Non seguo? Si prega di consultare http://wpfslguidance.codeplex.com/releases/view/30311. Non è solo un sottoinsieme di WPF, una delle principali differenze è la facilità con cui distribuire le applicazioni Silverlight via Web. Guarda il supporto per la sovrapposizione di video in Silverlight per ulteriori informazioni. –

+0

@Chris ha già un'app di winforms in cui vuole inserire questa funzionalità. Come risolve Silverlight? Inoltre, SL non può essere eseguito con piena attendibilità (elevato-sì ma non pieno) e SL MediaElement può riprodurre solo video WMV VC-1 o h.264. WMP o WPF MediaPlayer può riprodurre qualsiasi video su cui l'utente ha installato i codec. –

0

Si potrebbe guardare XNA (www.xna.com) da Microsoft. È fatto per le lingue gestite come C# e dovrebbe support video.

L'ho usato solo per disegnare in C#, ma ha il compito.

Devo anche notare che XNA funzionerà come parte di una normale app Windows Form. Per quello che vale, ho anche prototipato qualcosa di simile con Flash; Flash ti consente di importare ogni fotogramma del filmato nell'editor e creare un file SWF in grado di rispondere all'interazione dell'utente.

Tuttavia, questo approccio è inutile se è necessario aggiornare il film in tempo reale. Flash (l'ultima volta che ho controllato) poteva importare il film solo al design.

0

Ho trovato come fare questo.
Ecco un modo in WPF utilizzando 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(); 
    } 
} 

quindi creare eventi del mouse per Canvas e disegnare con esso

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

Questo può essere fatto in WinForms, ma non è facile. Esiste un supporto per i moduli trasparente con alpha blending in WinForms. Utilizza i seguenti CreateParams per il modulo di overlay trasparente: WS_EX_LAYERED, WS_EX_TRANSPARENT. Controllare i riferimenti MSDN per questo tipo di finestra: http://msdn.microsoft.com/en-us/library/ms997507.aspx, http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#layered.

Inserisci un modulo trasparente sopra il controllo video e puoi disegnare tutto ciò che desideri su di esso. Spostare e ridimensionare gli eventi devono essere coordinati tra la finestra del video e il modulo trasparente sopra di esso. Il ridisegno dell'overlay deve utilizzare UpdateLayeredWindow() in user32.dll.

Ho imparato un bel po 'da questo esempio: http://www.codeproject.com/Articles/13558/AlphaGradientPanel-an-extended-panel.

Problemi correlati