2012-04-04 11 views
5

Dopo aver deciso di provare AForge per video e roba di imaging, ho cercato di implementare this simple demo:Cosa potrebbe causare un'eccezione Argument quando si aggiorna un PictureBox?

private void Main_Load(object sender, EventArgs e) 
{ 
     // enumerate video devices 
     FilterInfoCollection videoDevices = new FilterInfoCollection(
         FilterCategory.VideoInputDevice); 
     // create video source 
     VideoCaptureDevice videoSource = new VideoCaptureDevice(
         videoDevices[0].MonikerString); 
     // set NewFrame event handler 
     videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame); 
     // start the video source 
     videoSource.Start(); 
} 

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
     this.pictureBox1.Image = eventArgs.Frame; 
} 

Il problema è che ottengo sempre un ArgumentException, anche se non sempre accade subito. Si apre il Application.Run(new Main());, ma la parte superiore del stacktrace si presenta così:

  • at System.Drawing.Image.get_Width() at System.Drawing.Image.get_Size()
  • at System.Windows.Forms.PictureBox.ImageRectangleFromSizeMode(PictureBoxSizeMode mode)
  • at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)

Non so se questo è rilevante, ma l'attributo ParamName del l'eccezione è nulla. Ho provato a racchiudere l'assegnazione dell'immagine in un try ... catch block, ma questo non ha aiutato. Ho anche verificato che l'immagine non sia nulla prima dell'assegnazione. Ho anche controllato le immagini non nulle, ma 0x0.

Cosa ho fatto di sbagliato? Qualcuno può suggerire una soluzione alternativa?

+1

Qual è il messaggio nell'eccezione? –

+1

@DavidNelson buona domanda: "Il parametro non è valido." –

+0

Qual è l'altezza e la larghezza di eventArgs.Frame quando lo si imposta? –

risposta

5

Penso che il problema è che non si effettua una copia della bitmap (frame) passata nel gestore eventi.

La documentazione AForge dice:

Dal sorgente video può avere più clienti, ogni cliente è responsabile per fare una copia (clonazione) del frame video passato, perché la sorgente video dispone un proprio originale copia dopo la notifica dei clienti.

Quindi, se si assegna direttamente il telaio alla casella di immagine la bitmap potrebbe essere smaltito dal quadro AForge mentre il PictureBox sta cercando di disegnare la bitmap.

+0

Questo è un vincitore. L'intenzione è che tu la disegna subito, non lasciarla per dopo. Non c'è più tardi nella riproduzione di video. –

+0

Questo ha funzionato - grazie. –

Problemi correlati