C# 返回位图上的System.ArgumentException
相关代码:C# 返回位图上的System.ArgumentException,c#,exception,bitmap,return,screenshot,C#,Exception,Bitmap,Return,Screenshot,相关代码: private Bitmap GetScreenShot() { Bitmap screenImage = null; using (screenImage = new Bitmap(panelPreview.Width, panelPreview.Height)) { using (Graphics g = Graphics.FromImage(screenImage)) {
private Bitmap GetScreenShot()
{
Bitmap screenImage = null;
using (screenImage = new Bitmap(panelPreview.Width, panelPreview.Height))
{
using (Graphics g = Graphics.FromImage(screenImage))
{
Rectangle rectanglePanelVideoPreview = panelPreview.Bounds;
Point sourcePoints = panelPreview.PointToScreen(new Point(panelPreview.ClientRectangle.X, panelPreview.ClientRectangle.Y));
g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size);
}
}
return screenImage;
}
位图screenImage在我逐步完成代码并进入
return screenImage
由于某种原因,位图离开后,其完整性会失败
using (screenImage = new Bitmap(panelPreview.Width, panelPreview.Height))
{...
}
感谢您的帮助。发生这种情况是因为代码:
using (screenImage = ...)
{
}
最终处理屏幕图像
。因此,最终返回的是一个已处理的对象
使用稍微修改代码以删除,即可解决问题:
private Bitmap GetScreenShot()
{
Bitmap screenImage = new Bitmap(panelPreview.Width, panelPreview.Height))
using (Graphics g = Graphics.FromImage(screenImage))
{
Rectangle rectanglePanelVideoPreview = panelPreview.Bounds;
Point sourcePoints = panelPreview.PointToScreen(new Point(panelPreview.ClientRectangle.X, panelPreview.ClientRectangle.Y));
g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size);
}
return screenImage;
}
但是,当您使用完位图后,应该记住对该位图调用Dispose
。尤其是如果这是您经常做的事情。发生这种情况是因为代码:
using (screenImage = ...)
{
}
最终处理屏幕图像
。因此,最终返回的是一个已处理的对象
使用
稍微修改代码以删除,即可解决问题:
private Bitmap GetScreenShot()
{
Bitmap screenImage = new Bitmap(panelPreview.Width, panelPreview.Height))
using (Graphics g = Graphics.FromImage(screenImage))
{
Rectangle rectanglePanelVideoPreview = panelPreview.Bounds;
Point sourcePoints = panelPreview.PointToScreen(new Point(panelPreview.ClientRectangle.X, panelPreview.ClientRectangle.Y));
g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size);
}
return screenImage;
}
但是,当您使用完位图后,应该记住对该位图调用Dispose
。尤其是如果这是您经常要做的事情。还应该提到,如果在返回函数中未正确处理位图,则像这样返回位图可能会导致内存泄漏。
上面Jim的回答将解决您的程序,使其不再有运行时错误,但只要没有正确处理返回的位图,GC在返回内存时可能会有延迟,因此您必须手动清除位图返回的位置的Dispose() 还应该提到的是,如果在返回函数中未正确处理位图,则像这样返回位图可能会导致内存泄漏。
上面Jim的回答将解决您的程序,使其不再有运行时错误,但只要没有正确处理返回的位图,GC在返回内存时可能会有延迟,因此您必须手动清除位图返回的位置的Dispose() 为什么不重用现有示例,例如使用
处理位图。一旦你归还它,任何东西都无法使用它。删除外部using块并仅返回位图。然后,当您在代码的其余部分使用完它后,您就可以处理它了。@LeiYang我试图将它分离出来,这样我就可以在其他地方使用它,而无需多次重写代码,但我可以解决它。感谢heaps的帮助。@FloatingKiwi工作得很好,感谢heaps的帮助。为什么不重用现有示例,例如使用处理位图。一旦你归还它,任何东西都无法使用它。删除外部using块并仅返回位图。然后,当您在代码的其余部分使用完它后,您就可以处理它了。@LeiYang我试图将它分离出来,这样我就可以在其他地方使用它,而无需多次重写代码,但我可以解决它。谢谢你的帮助。@FloatingKiwi工作得很好,谢谢你的帮助。