【问题标题】:System.ArgumentException on returned Bitmap返回位图上的 System.ArgumentException
【发布时间】:2017-03-30 01:38:13
【问题描述】:

相关代码:

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;
    }

当我单步执行代码并到达时,Bitmap screenImage 会引发异常

return screenImage

Screenshot

由于某种原因,Bitmap 离开后的完整性失败

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

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

【问题讨论】:

  • 为什么不重用现有的样本,例如so
  • Using 处理位图。一旦您退回它,任何东西都将无法使用。删除外部 using 块,只返回位图。然后,当您在其余代码中完成使用它时,您可以将其处理掉。
  • @LeiYang 我试图将它分开,这样我就可以在其他地方使用它而无需多次重写代码,但我可以解决它。非常感谢您的帮助。
  • @FloatingKiwi 效果很好,非常感谢您的帮助。

标签: c# exception bitmap return screenshot


【解决方案1】:

发生这种情况是因为代码:

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。特别是如果这是您经常做的事情。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2021-11-20
      • 1970-01-01
      • 2019-12-27
      相关资源
      最近更新 更多