2016-05-17 14 views
0

Ich verwende derzeit AForge DLL, um das Video auf der Bildbox für die Live-Ansicht zu rendern. Ich habe eine Video-Frame-Funktion, ob WriteFrame oder Screenshot den aktuellen Picture-Box-Rahmen als JPG.System.Drawing-Parameter ist nicht gültig

Aber ich traf ein Problem, wenn das Programm irgendwann einen Fehler von Parameter ist nicht gültig oder Objekt wurde an anderer Stelle verwendet. Ich habe versucht, eine Lösung zu finden, um es zu lösen, und ich bin ziemlich sicher, dass ich über das Image und das Klon-Image verfügte, aber das Problem besteht immer noch.

Können Sie mir helfen, was ich mit meinem Programm falsch gemacht habe?

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(); 

Hier sind die Stack-Trace-Fehler:

{"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) 

AKTUALISIERT Code:

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

In welcher Zeile tritt der Fehler auf? –

+0

@JeremyThompson livePreview.Refresh() – Marcus

+0

Versuchen Sie 'livePreview.Invalidate()' stattdessen. –

Antwort

1

Du livePreview.Image.Dispose() im UI-Thread aufrufen, aber Sie sind nicht livePreview.Image Einstellung danach auf null .

Zwischen der Zeit livePreview.Image und der Zeit, zu der Sie ihr ein neues Bild zuweisen, zeigt livePreview.Image auf ein Objekt.

Also ich denke mal Ihre Bildbox versucht, sich während dieser Zeit zu zeichnen, und schlägt fehl, wenn es versucht, auf seine (entsorgte) Bildeigenschaft zuzugreifen.

Die Lösung wäre:

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

Oder noch besser, im gleichen Schritt das neue Bild zuordnen:

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

In der Regel müssen Sie verstehen, was mit Ihren verschiedenen Bitmap-Objekten geschehen . Alles, was einen Verweis auf eine entsorgte Bitmap enthält, ist ein Problem.

+0

Stimmt das auch für das Video? Ich meine den FileWriter für die Videoaufnahme – Marcus

+0

Ich sehe kein Problem mit diesem Teil, es geschieht alles auf dem gleichen Thread soweit ich sehen kann. – Blorgbeard

+0

Bitte beachten Sie meinen Update-Code, ich musste Änderungen an meinem Code vornehmen. Ist das in Ordnung mit dem Code? – Marcus