不同的事件。相同的调用但导致System.ArgumentException(无效的参数)

时间:2014-07-23 00:49:12

标签: c# winforms

我在行中收到零星的System.ArgumentException(Details:Invalid Argument)

    System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(currentBitMap);

以下方法:

protected void imageSnapTimer_Tick(object sender, EventArgs e)
{
...
        if (flashFader > 0 && pictureBox.Image != null)
        {
            lock (LockSyncronize)
            {
                System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(currentBitMap);
                Brush brush = new SolidBrush(Color.FromArgb(flashFader, 255, 255, 255));
                gr.FillRectangle(brush, 0, 0, currentBitMap.Width, currentBitMap.Height);
                gr.Dispose();

            }
        }
    ...
    pictureBox.Image = currentBitMap;
...
}

imageSnapTimer是VS UIDesigner添加的Timer。其中imageSnapTimer由计时器触发。

imageSnapTimer.Tick += new EventHandler(imageSnapTimer_Tick);

currentBitMap被

创建的方法改变了
videoSource.NewFrame += new AForge.Video.NewFrameEventHandler(videoSource_NewFrame);

void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
    lock (LockSyncronize)
    {
        currentBitMap = (Bitmap)eventArgs.Frame.Clone();
    }
}

如果我在videoSource_NewFrame中使用相同的同步块imageSnapTimer_Tick,则可以正常工作。

1 个答案:

答案 0 :(得分:0)

抱歉我的错。

在我访问currentBitmap之前,我尝试保存图像。

    private void saveScreenShot(Bitmap image)
    {
        image.Save(curPath + "/" + imagesLeft + ".jpg");
        image.Dispose();
        imagesLeft = imagesLeft + 1;
    ...

解决方案只是为此方法提供克隆,而不是使用原始方法。

    ...
    saveScreenShot((Bitmap)currentBitMap.Clone());
    ...