2012-04-04 19 views
5

Sau khi quyết định thử AForge cho video và các công cụ hình ảnh, tôi đã cố gắng để thực hiện this simple demo:Điều gì có thể gây ra một ArgumentException khi cập nhật một 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; 
} 

Vấn đề là tôi luôn luôn nhận được một ArgumentException, mặc dù không phải lúc nào xảy ra ngay lập tức. Nó bật lên trên Application.Run(new Main());, nhưng phía trên cùng của stacktrace trông như thế này:

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

Không chắc nếu điều này là có liên quan, nhưng ParamName thuộc tính của ngoại lệ là null. Tôi đã cố gắng gói chuyển nhượng hình ảnh trong một khối try ... catch, nhưng điều này đã không giúp đỡ. Tôi cũng đã kiểm tra để đảm bảo rằng hình ảnh không phải là null trước khi gán. Tôi cũng đã kiểm tra các hình ảnh có kích thước 0x0 không phải là rỗng.

Tôi đã làm gì sai? Bất cứ ai có thể đề nghị một workaround?

+1

Thông báo trong trường hợp ngoại lệ là gì? –

+1

@DavidNelson câu hỏi hay: "Thông số không hợp lệ". –

+0

Chiều cao và Chiều rộng của eventArgs.Frame khi bạn đặt nó là gì? –

Trả lời

5

Tôi nghĩ rằng vấn đề là bạn không tạo một bản sao của bitmap được truyền (khung) trong trình xử lý sự kiện của bạn.

Các tài liệu AForge nói:

Kể từ nguồn video có thể có nhiều khách hàng, mỗi khách hàng là trách nhiệm để thực hiện một bản sao (clone) của khung hình trôi qua, bởi vì nguồn video disposes gốc riêng của mình sao chép sau khi thông báo cho khách hàng.

Vì vậy, nếu bạn trực tiếp gán khung để hình hộp bitmap có thể được xử lý theo khuôn khổ AForge trong khi PictureBox đang cố gắng rút ra những bitmap.

+0

Đó là một người chiến thắng. Mục đích là bạn vẽ nó ngay lập tức, không để nó sau này. Không có sau này trong phát lại video. –

+0

Điều đó đã làm điều đó - cảm ơn. –

Các vấn đề liên quan