首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Drawing参数无效

System.Drawing参数无效
EN

Stack Overflow用户
提问于 2016-05-17 06:04:01
回答 1查看 8.2K关注 0票数 4

我目前正在使用AForge动态链接库在实时视图的图片框上呈现视频。我确实有一个视频帧功能,无论是WriteFrame还是屏幕,都可以将当前的picturebox帧作为JPG进行截取。

但我遇到了一个问题,有时程序会提示参数错误无效,或者在其他地方使用对象。我确实试图找到解决方案来解决这个问题,我确信我确实在图像和克隆图像上进行了处理,但问题仍然存在。

你能帮我查一下我的节目做错了什么吗?

代码语言:javascript
复制
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();

下面是堆栈跟踪错误:

代码语言:javascript
复制
{"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)

更新代码:

代码语言:javascript
复制
 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);
                }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-24 02:59:09

在UI线程中调用livePreview.Image.Dispose(),但之后不会将livePreview.Image设置为null。

因此,在您释放livePreview.Image的时间和为其分配新图像的时间之间,livePreview.Image指向已释放的对象。

因此,我认为您的picturebox有时会尝试在此期间绘制自己,并在尝试访问其(disposed) Image属性时失败。

解决办法是:

代码语言:javascript
复制
if (livePreview.Image != null)
{
    //Dispose the resources
    this.Invoke(new MethodInvoker(delegate() { 
        livePreview.Image.Dispose(); 
        livePreview.Image = null;
    }));
}

或者更好的是,在相同的步骤中分配新的图像:

代码语言:javascript
复制
var newFrame = (Bitmap)eventArgs.Frame.Clone();
this.Invoke(new MethodInvoker(delegate() { 
    if (livePreview.Image != null)
    {
        livePreview.Image.Dispose(); 
    }
    livePreview.Image = newFrame;
}));

通常,您需要了解不同的位图对象发生了什么。保存对已处理的位图的引用的任何内容都将是一个问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37268313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档