2012-04-04 3 views
5

Решив попробовать AForge для видео и прочее изображений, я попытался реализовать this simple demo:Что может вызвать исключение ArgumentException при обновлении 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; 
} 

Проблема заключается в том, что я всегда получаю ArgumentException, хотя и не всегда происходит сразу. Она выскакивает на Application.Run(new Main());, но в верхней части StackTrace выглядит следующим образом:

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

Не уверен, если это уместно, но атрибут ParamName Исключение составляет null. Я попытался объединить назначение изображения в блок try ... catch, но это не помогло. Я также проверил, чтобы изображение не было нулевым до назначения. Я также проверил для изображений, отличных от нуля, но размером 0x0.

Что я сделал не так? Может ли кто-нибудь предложить обходной путь?

+1

Что такое сообщение в исключении? –

+1

@DavidNelson хороший вопрос: «Параметр недействителен». –

+0

Что такое высота и ширина eventArgs.Frame, когда вы его устанавливаете? –

ответ

5

Я думаю, что проблема в том, что вы не делаете копию переданного растрового изображения (кадра) в обработчике событий.

AForge документация говорит:

Поскольку источник видео может иметь несколько клиентов, каждый клиент несет ответственность за изготовление копии (клонирование) из переданного видеокадра, так как источник видео располагает своим собственным оригиналом копировать после уведомления клиентов.

Итак, если вы напрямую назначить рамку на поле изображения растровый может быть утилизированы в рамках AForge в то время как PictureBox пытаются нарисовать битмап.

+0

Это победитель. Намерение состоит в том, что вы нарисовали его сразу, а не оставлять его на потом. В воспроизведении видео более не существует. –

+0

Это сделало трюк - спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^