[英]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.