2012-04-04 17 views
5

AForge für Video- und Bild Sachen zu versuchen, entschied Nachdem ich versuchte this simple demo umzusetzen:Was könnte beim Aktualisieren einer PictureBox zu einer ArgumentException führen?

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

Das Problem ist, dass ich immer ein ArgumentException bekommen, immer sofort ist allerdings nicht passieren. Es erscheint auf Application.Run(new Main());, aber die Spitze des Stacktrace sieht wie folgt aus:

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

nicht sicher, ob dies relevant ist, aber das ParamName Attribut des Ausnahme ist null. Ich habe versucht, die Bildzuweisung in einen try ... catch-Block zu schreiben, aber das hat nicht geholfen. Ich habe auch überprüft, um sicherzustellen, dass das Bild vor der Zuweisung nicht null ist. Ich habe auch nach nicht-null, aber 0x0 großen Bildern gesucht.

Was habe ich falsch gemacht? Kann jemand einen Workaround vorschlagen?

+1

Was ist die Nachricht in der Ausnahme? –

+1

@DavidNelson gute Frage: "Parameter ist nicht gültig." –

+0

Was ist die Höhe und Breite von eventArgs.Frame, wenn Sie es einstellen? –

Antwort

5

Ich denke, das Problem ist, dass Sie keine Kopie der übergebenen Bitmap (Frame) in Ihrem Event-Handler.

Die AForge Dokumentation sagt:

Da Videoquelle mehrere Clients haben kann, jeder Kunde verantwortlich ist für die Herstellung eine Kopie (Klonen) des Videorahmens geführt, weil die Videoquelle sein eigenes Original verfügt Kopie nach Benachrichtigung der Kunden.

Also, wenn Sie direkt den Rahmen zu dem Bildfeld die Bitmap zuweisen könnte durch den AForge Rahmen angeordnet werden, während der PictureBox versucht, das Bitmap zu zeichnen.

+0

Das ist ein Gewinner. Die Absicht ist, dass Sie es sofort zeichnen, um es nicht für später zu verlassen. Es gibt keine spätere Wiedergabe von Videos. –

+0

Das hat den Trick - danke. –