2012-04-04 22 views
5

Después de haber decidido probar AForge para vídeo y material de imagen, he tratado de poner en práctica this simple demo:¿Qué podría causar una excepción ArgumentException al actualizar 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; 
} 

El problema es que siempre me sale un ArgumentException, aunque no siempre ocurre de inmediato. Que aparece en Application.Run(new Main());, pero la parte superior de la StackTrace se ve así:

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

No estoy seguro si esto es relevante, pero el atributo ParamName de la la excepción es nula. He intentado ajustar la asignación de imágenes en un intento ... atrapar bloque, pero esto no ayudó. También revisé para asegurarme de que la imagen no sea nula antes de la asignación. También he comprobado imágenes que no son nulas, pero de tamaño 0x0.

¿Qué he hecho mal? ¿Alguien puede sugerir una solución alternativa?

+1

¿Cuál es el mensaje en la excepción? –

+1

@DavidNelson buena pregunta: "El parámetro no es válido". –

+0

¿Cuál es la altura y el ancho de eventArgs.Frame cuando lo configura? –

Respuesta

5

Creo que el problema es que no hace una copia del mapa de bits pasado (marco) en su controlador de eventos.

La documentación AForge dice:

Desde la fuente de vídeo puede tener varios clientes, cada cliente es responsable para hacer una copia (clonación) de la trama de vídeo pasado, debido a que la fuente de vídeo dispone de su propio originales copia después de notificar a los clientes.

Por lo tanto, si se asigna directamente a la estructura del cuadro de imagen el mapa de bits podría ser dispuesto por el marco AForge mientras que el PictureBox está tratando de dibujar el mapa de bits.

+0

Ese es un ganador. La intención es dibujarlo de inmediato, no dejarlo para más adelante. No hay una reproducción de video posterior. –

+0

Eso hizo el truco, gracias. –

Cuestiones relacionadas