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工作得很好,谢谢你的帮助。