2012-04-04 17 views
5

Po postanowił spróbować AForge wideo i obrazowania rzeczy, starałem się wdrożyć this simple demo:Co może spowodować wyjątek ArgumentException podczas aktualizowania 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; 
} 

Problemem jest to, że zawsze uzyskać ArgumentException, choć nie zawsze zdarza się od razu. To wyskakuje na Application.Run(new Main());, ale górna część stacktrace wygląda następująco:

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

Nie wiem, czy to jest istotne, ale atrybut ParamName wyjątek ma wartość null. Próbowałem owijać obrazek przy próbie ... catch block, ale to nie pomogło. Sprawdziłem również, aby upewnić się, że obraz nie jest pusty przed przypisaniem. Sprawdziłem również pod kątem nie-zerowych obrazów, ale o rozmiarach 0x0.

Co zrobiłem źle? Czy ktoś może zaproponować obejście tego problemu?

+1

Co to jest wiadomość w wyjątku? –

+1

@DavidNelson dobre pytanie: "Parametr jest nieprawidłowy." –

+0

Jaka jest wysokość i szerokość obiektu eventArgs.Frame po ustawieniu? –

Odpowiedz

5

Myślę, że problem polega na tym, że nie wykonuje się kopii bitowej mapy (ramki) w programie obsługi zdarzeń.

AForge dokumentacja mówi:

Ponieważ źródło wideo może mieć wielu klientów, każdy klient jest odpowiedzialny do wykonywania kopii (klonowania) z przekazanym klatki wideo, ponieważ źródło wideo dysponuje własną oryginał skopiuj po powiadomieniu klientów.

Tak więc, jeśli bezpośrednio przypisać ramkę do okna obrazu bitmapy mogą być usuwane przez ramy AForge natomiast PictureBox próbuje narysować mapę bitową.

+0

To zwycięzca. Chodzi o to, aby od razu ją narysować, nie pozostawiając go na później. Nie ma późniejszego odtwarzania wideo. –

+0

To wystarczyło - dzięki. –

Powiązane problemy