我目前正在使用AForge动态链接库在实时视图的图片框上呈现视频。我确实有一个视频帧功能,无论是WriteFrame还是屏幕,都可以将当前的picturebox帧作为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);
}发布于 2016-05-24 02:59:09
在UI线程中调用livePreview.Image.Dispose(),但之后不会将livePreview.Image设置为null。
因此,在您释放livePreview.Image的时间和为其分配新图像的时间之间,livePreview.Image指向已释放的对象。
因此,我认为您的picturebox有时会尝试在此期间绘制自己,并在尝试访问其(disposed) 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;
}));通常,您需要了解不同的位图对象发生了什么。保存对已处理的位图的引用的任何内容都将是一个问题。
https://stackoverflow.com/questions/37268313
复制相似问题