Conversione Porzione di codice da C# a VBNET

venerdì 03 dicembre 2010 - 11.13
Tag Elenco Tags  C#  |  VB.NET  |  .NET 3.5  |  Windows 7  |  Windows Vista  |  Windows XP  |  Visual Studio 2008  |  Visual Studio Express

AGiSoft Profilo | Newbie

Buongiorno a tutta la comunità,
sto da qualche giorno approcciando alla cattura video con DX e DShow e sto scrivendo il codice per la cattura in VBNet utilizzando le classi Directx.Capture e DShowNET. Mi trovo però in una situazione in cui non riesco ad eseguire una conversione del codice e mi chiedevo se qualcuno di voi poteva aiutarmi.

Trovate il riferimento alle librerie a questo indirizzo: http://www.codeproject.com/KB/audio-video/SampleGrabber.aspx

In pratica ho già implemetato tutto quello che mi serve devo però poter scattare la foto al contenuto della PictureBox e sono rimasto bloccato.

Il codice che dovrei convertire è il seguente, spero possiate aiutarmi:

private void button1_Click(object sender, System.EventArgs e) { this.capture.FrameEvent2 += new Capture.HeFrame(this.CaptureDone); this.capture.GrapImg(); } private void CaptureDone(System.Drawing.Bitmap e) { this.pictureBox1.Image=e; // Show only the selected frame ... // If you want to capture all frames, then remove the next line this.capture.FrameEvent2 -= new Capture.HeFrame(this.CaptureDone); } private void button2_Click(object sender, System.EventArgs e) { if( (this.pictureBox1 != null)&& (this.pictureBox1.Image != null)&& (this.imageFileName.Text.Length > 0) ) { this.pictureBox1.Image.Save(this.imageFileName.Text, System.Drawing.Imaging.ImageFormat.Bmp); } }

AntCiar Profilo | Expert

Ciao. Ti traduco il codice a pezzi.
PS. La traduzione l'ho fatta direttamente qui senza usare VisualStudio quindi può darsi che ci siano degli errori di sintassi...

>private void button1_Click(object sender, System.EventArgs e)
>{
>this.capture.FrameEvent2 += new Capture.HeFrame(this.CaptureDone);
> this.capture.GrapImg();
>}
>

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>private void CaptureDone(System.Drawing.Bitmap e)
>{
> this.pictureBox1.Image=e;
> // Show only the selected frame ...
>// If you want to capture all frames, then remove the next line
>this.capture.FrameEvent2 -= new Capture.HeFrame(this.CaptureDone);
>}

private sub CaptureDone(byval e as System.Drawing.Bitmap) me.pictureBox1.Image=e ''Show only the selected frame ... ''If you want to capture all frames, then remove the next line removehandler capture.FrameEvent2, addressof this.CaptureDone end sub

>private void button2_Click(object sender, System.EventArgs e)
>{
> if( (this.pictureBox1 != null)&&
> (this.pictureBox1.Image != null)&&
> (this.imageFileName.Text.Length > 0) )
> {
> this.pictureBox1.Image.Save(this.imageFileName.Text,
> System.Drawing.Imaging.ImageFormat.Bmp);
> }
>}

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ciao ciao
Cristian Barca

AGiSoft Profilo | Newbie

Ciao Cristian, innanzi tutto ti ringrazio per la velocissima risposta!

Però... c'è un problema sull'aggancio dell'handle di Capture.FrameEvent2

Ovvero, il Debug non restituisce nessun errore però in pratica Sub CaptureDone non viene eseguita al momento della cattura e quindi in realtà non accade nulla

AntCiar Profilo | Expert

Ciao.

Questo dovrebbe essere un problema del componente che non scatena l'evento. Puoi fare anche una prova utilizzando un progetto in C#.
Ti crei una form con sopra due bottoni e la picturebox. Copia e incolla nella form il codice originario. Aggancia i riferimenti alle varie librerie che ti servono. Poi seleziona in progettazione il bottone1, vai nella sezione degli eventi e sul 'click' apri la combo e seleziona "button1_click". Mi raccomando apri la combo ma non fare mai "doppio click" altrimenti ti creerà un altro handler (tipo button1_click_1) e poi ti costringe a spostare il codice. Fai poi la stessa cosa per il bottone2.

Vedi se in questo modo funziona. Se così va allora ti conviene lasciare questa funzione nel progetto C#, aggiungi questo progetto alla tua soluzione (si possono avere anche progetti di diversa natura in una unica soluzione) e ti crei dei metodi pubblici da poter richiamare dal progetto in VB. In pratica ti devi creare quello che in gergo si chiama Wrapper.

Ciao ciao

Cristian Barca

AGiSoft Profilo | Newbie

Hmm, se si potesse fare con la versione Express lo farei più che volentieri :-)
In ogni caso provo a vedere se in un progetto nuovo in C# almeno funziona, così almeno si potrà capire se l'evento viene scatenato o viene ignorato.
Grazie comunque

AGiSoft Profilo | Newbie

Da quello che ho capito pare che bisognerebbe associare all'evento FrameEvent2 il delegato Capture.Heframe e passare come parametro CaptureDone nel cui (e as Bitmap) parametro sarà contenuta l'immagine "grabbata" .. il problema mi sa che è la creazione di questo ponte... ovviamente la mia è un'ipotesi... qualche altro suggerimento?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5