系统.返回位图的ArgumentException

本文关键字:ArgumentException 位图 返回 系统 | 更新日期: 2023-09-27 18:18:01

相关代码:

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

截图

由于某些原因,位图的完整性在离开

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

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

系统.返回位图的ArgumentException

这是因为代码:

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

还应该提到,如果Bitmap在返回函数中没有被正确处理,那么像这样返回Bitmap可能会导致内存泄漏。上面Jim的答案将解决您的程序,使其不再有运行时错误,但只要没有正确处理返回的Bitmap, GC可能会延迟返回内存,因此您将不得不手动清理Bitmap, Dispose(),无论它返回到哪里。