簡體   English   中英

System.Drawing參數無效

[英]System.Drawing Parameter is not valid

我目前正在使用AForge dll在圖片框中渲染實時視圖的視頻。 我確實有一個視頻幀功能,無論是WriteFrame還是將當前的圖片框框架截圖為JPG。

但是我遇到了一個問題,有時程序會提示參數無效或者其他地方使用了對象的錯誤。 我確實試圖找到解決方案來解決它,我很確定我已經處理了圖像和克隆圖像,但問題仍然存在。

你能幫助我解決我的計划錯誤嗎?

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

你在UI線程中調用livePreview.Image.Dispose() ,但之后你沒有將livePreview.Image設置為null。

因此,在您處理livePreview.Image的時間和為其分配新圖像的時間之間, livePreview.Image指向已處置的對象。

因此,我認為偶爾你的圖片框試圖在這段時間內繪制自己,並在嘗試訪問其(處置的)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對象所發生的情況。 任何保留對已經處置的位圖的引用都將是一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM