类型' System.ArgumentException'的第一次机会异常发生在System.Drawing.dll中

时间:2014-03-08 18:18:30

标签: c# graphics bitmap screenshot

我正在尝试制作全屏截图并将其加载到pictureBox中,但它给了我这个错误: System.Drawing.dll中出现'System.ArgumentException'类型的第一次机会异常 附加信息:Ongeldige参数。

代码:

    using (Bitmap bmpScreenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                                Screen.PrimaryScreen.Bounds.Height))
    {
        using (Graphics g = Graphics.FromImage(bmpScreenCapture))
        {
            g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                             Screen.PrimaryScreen.Bounds.Y,
                             0, 0,
                             bmpScreenCapture.Size,
                             CopyPixelOperation.SourceCopy);
        }

        pictureBox1.Image = bmpScreenCapture;
    }

Joery。

3 个答案:

答案 0 :(得分:8)

发生异常是因为using语句在将Bitmap分配给pictureBox1.Image后将其处理掉,因此PictureBox在重新绘制自身时无法显示位图:

using (Bitmap bmpScreenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                            Screen.PrimaryScreen.Bounds.Height))
{
    // ...

    pictureBox1.Image = bmpScreenCapture;
} // <== bmpScreenCapture.Dispose() gets called here.

// Now pictureBox1.Image references an invalid Bitmap.

要解决此问题,请保留Bitmap变量声明和初始值设定项,但删除using

Bitmap bmpScreenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                     Screen.PrimaryScreen.Bounds.Height);

// ...

pictureBox1.Image = bmpScreenCapture;

你仍然应该确保最终处理Bitmap,但只有当你真的不再需要它时(例如,如果你稍后用另一个位图替换pictureBox1.Image)。

答案 1 :(得分:4)

您正在处理错误的位图。您应该处理图像,即您替换的图像,而不是您刚刚创建的图像。如果没有正确执行此操作,除了在绘制图像时崩溃程序,最终会在内存不足时使用此异常炸弹程序。你发现了。修正:

var bmpScreenCapture = new Bitmap(...);
using (var g = Graphics.FromImage(bmpScreenCapture)) {
    g.CopyFromScreen(...);
}
if (pictureBox1.Image != null) pictureBox1.Image.Dispose();      // <=== here!!
pictureBox1.Image = bmpScreenCapture;

答案 2 :(得分:1)

你可以尝试一下,它会起作用

  pictureBox1.Image = new Bitmap(sourceBitmap);