创建位图时C#内存不足

时间:2010-11-30 20:58:38

标签: c# winforms memory bitmap screenshot

我正在创建一个应用程序(Windows窗体),允许用户根据他们选择的位置截取屏幕截图(拖动到选择区域)。我想添加一个放大的“预览窗格”,以便用户可以更精确地选择他们想要的区域(更大的像素)。在mousemove事件中,我有以下代码...

private void falseDesktop_MouseMove(object sender, MouseEventArgs e)
    {
        zoomBox.Image = showZoomBox(e.Location);
        zoomBox.Invalidate();
        bmpCrop.Dispose();
    }

private Image showZoomBox(Point curLocation)
    {
        Point start = new Point(curLocation.X - 50, curLocation.Y - 50);
        Size size = new Size(100, 90);
        Rectangle rect = new Rectangle(start, size);
        Image selection = cropImage(falseDesktop.Image, rect);
        return selection;
    }

private static Bitmap bmpCrop;
private static Image cropImage(Image img, Rectangle cropArea)
    {
        if (cropArea.Width != 0 && cropArea.Height != 0)
        {
            Bitmap bmpImage = new Bitmap(img);
            bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
            bmpImage.Dispose();
            return (Image)(bmpCrop);
        }
        return null;
    }

失败且具有内存不足异常的行是:

bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);

基本上它的作用是在鼠标指针周围需要一个100x90的矩形并将其拉入zoomBox,这是一个图片框控件。但是,在此过程中,我收到Out Of Memory错误。我在这里做错了什么?

感谢您的协助。

6 个答案:

答案 0 :(得分:16)

C#成像内存不足,通常是错误的矩形或点的标志 - 有点红鲱鱼。我敢打赌start发生错误时负X或Y 尺寸。高+ Y或尺寸。宽度+ X大于图像的高度或宽度

答案 1 :(得分:8)

MSDN解释说OutOfMemoryException表示

  

rect位于源位图边界之外

其中rectBitmap.Clone方法的第一个参数。

因此,请检查cropArea参数是否不大于您的图片。

在GDI +中,OutOfMemoryException并不意味着“内存不足”; GDI +错误代码OufOfMemory已被重载以表示不同的事情。其原因具有历史意义,Hans Passant在another answer中有很好的描述。

答案 2 :(得分:4)

使用像这样的Bitmap对象:

using (Bitmap bmpImage = new Bitmap(img))
{
    // Do something with the Bitmap object
}

答案 3 :(得分:0)

你应该检查curLocation.X是否大于50,否则你的矩形将从负区域开始(当然还有curLocation.Y)

答案 4 :(得分:0)

如果缩放框离开桌面区域的边缘,那么当您尝试裁剪时,您要求系统制作包含视频内存区域之外的像素的新图像。确保限制缩放框,使其范围不小于0或大于屏幕边缘。

答案 5 :(得分:-2)

如果要反复创建新的位图,可能需要调用GC.Collect();来强制C#进行垃圾回收