我正在尝试制作全屏截图并将其加载到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。
答案 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);