2016-11-16 33 views
0

相关代码:System.ArgumentException上返回的位图

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 

Screenshot

出于某种原因,完整性抛出一个异常的位图失败后,它离开

using (screenImage = new Bitmap(panelPreview.Width, panelPreview.Height)) 
{... 
} 

任何援助都将不胜感激,谢谢。

+0

为什么不重用现有的示例,如[使用]'放置位图。[so](http://stackoverflow.com/questions/362986/capture-the-screen-into-a-bitmap) –

+0

一旦你返回它,什么都不能使用它。删除外部使用块,然后返回位图。然后,当你完成在代码的其余部分使用它时,你可以处理它。 – FloatingKiwi

+0

@LeiYang我试图分离它,所以我可以在别处重复使用代码,但我可以解决它。谢谢你的帮助。 – Pearcy

回答

2

这是因为代码:

using (screenImage = ...) 
{ 
} 

最终的处置screenImage。所以你最终返回的是一个处置对象。

你的代码去除using将解决这个问题的一个稍微的改变:

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对位图,当你使用它来完成。特别是如果这是你经常做的事情。

+0

非常感谢您的帮助。现在工作很完美。 – Pearcy

0

还应该提到的是,像这样返回一个位图可能导致内存泄漏,如果Bitmap在返回函数中没有正确处理。 上面Jim的答案将解决您的程序,使其不再有运行时错误,但只要没有正确处理返回的位图,GC可能会在返回内存时出现延迟,必须手动清理Dispose(),无论它返回的位置。