2016-05-17 4 views
0

В настоящее время я использую dll AForge для рендеринга видео в окне изображения для просмотра в реальном времени. У меня есть функция видеофрагмента, будь то WriteFrame или Screenshot текущий кадр изображения в формате JPG.Параметр System.Drawing недействителен

Но я столкнулся с проблемой, когда когда-нибудь программа запросит ошибку параметра, недействительна или объект используется в другом месте. Я попытался найти решение для его решения, и я уверен, что я использовал изображение и изображение клона, но проблема все еще существует.

Не могли бы вы помочь мне в том, что я сделал неправильно с моей программой?

void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs) 
     { 
      //your code using bmp object 
      if (D1Pic.BackColor == Color.Green) 
      { 
       video = (Bitmap)eventArgs.Frame.Clone(); 
       if (livePreview.Image != null) 
       { 
        //Dispose the resources 
        this.Invoke(new MethodInvoker(delegate() { livePreview.Image.Dispose(); })); 
       } 
       livePreview.Image = (Bitmap)eventArgs.Frame.Clone(); 
       imgclone = (Image)livePreview.Image.Clone(); 
       FileWriter.WriteVideoFrame(video); 
      } 
      else 
      { 
       video = (Bitmap)eventArgs.Frame.Clone(); 
       if (livePreview.Image != null) 
       { 
        //Dispose the resources 
        this.Invoke(new MethodInvoker(delegate() { livePreview.Image.Dispose(); })); 
        this.Invoke(new MethodInvoker(delegate() { video.Dispose(); })); 
       } 
       livePreview.Image = (Bitmap)eventArgs.Frame.Clone(); 
       imgclone = (Image)livePreview.Image.Clone(); 
      } 
      video.Dispose(); 
      livePreview.Refresh(); 

Вот ошибка трассировки стека:

{"Parameter is not valid."} 
    at System.Drawing.Image.get_Width() 
    at System.Windows.Forms.PictureBox.ImageRectangleFromSizeMode(PictureBoxSizeMode mode) 
    at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe) 
    at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer) 
    at System.Windows.Forms.Control.WmPaint(Message& m) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

ОБНОВЛЕНО КОД:

var newFrame = (Bitmap)eventArgs.Frame.Clone(); 
       this.Invoke(new MethodInvoker(delegate() 
       { 
        if (livePreview.Image != null) 
        { 
         livePreview.Image.Dispose(); 
        } 
        livePreview.Image = newFrame; 
       })); 
       imgclone = (Bitmap)eventArgs.Frame.Clone(); 

       //Write frame into video 
       if (D1Pic.BackColor == Color.Green) 
       { 
        video = (Bitmap)eventArgs.Frame.Clone(); 
        FileWriter.WriteVideoFrame(video); 
       } 
+0

В какой строке возникает ошибка? –

+0

@JeremyThompson livePreview.Refresh() – Marcus

+0

Попробуйте 'livePreview.Invalidate()' вместо этого. –

ответ

1

Вы вызываете в потоке пользовательского интерфейса livePreview.Image.Dispose(), но вы не устанавливая livePreview.Image обнулить после ,

Таким образом, между временем, которое вы располагаете livePreview.Image, и временем, когда вы назначаете ему новое изображение, livePreview.Image указывает на расположенный объект.

Так что я думаю, что иногда ваш фотошоп пытается нарисовать себя в течение этого времени и терпит неудачу, когда пытается получить доступ к свойству изображения.

Решение будет:

if (livePreview.Image != null) 
{ 
    //Dispose the resources 
    this.Invoke(new MethodInvoker(delegate() { 
     livePreview.Image.Dispose(); 
     livePreview.Image = null; 
    })); 
} 

Или еще лучше, назначить новое изображение на той же стадии:

var newFrame = (Bitmap)eventArgs.Frame.Clone(); 
this.Invoke(new MethodInvoker(delegate() { 
    if (livePreview.Image != null) 
    { 
     livePreview.Image.Dispose(); 
    } 
    livePreview.Image = newFrame; 
})); 

В общем, вы должны понимать, что происходит с вашими различными растровыми объектами , Будет проблема, связанная с удалением Bitmap.

+0

Это тоже самое для видео? Я имею в виду FileWriter для видеозаписи – Marcus

+0

Я не вижу проблемы с этой частью, все это происходит в том же потоке, насколько я могу видеть. – Blorgbeard

+0

См. Мой код обновления, я внес изменения в свой код. Это нормально с кодом? – Marcus