创建位图时C#内存不足

Ale*_*lex 11 c# memory screenshot bitmap winforms

我正在创建一个应用程序(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;
    }
Run Code Online (Sandbox Code Playgroud)

失败并具有Out of Memory异常的行是:

bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的协助.

Ali*_*tad 17

在C#成像中内存不足,通常是错误的矩形或点的标志 - 有点红鲱鱼.我赌注start具有负X或Y时发生错误或所述Size.Hight + Y或Size.Width + X比海特或图像的宽度更大.


Dir*_*mar 8

MSDN解释说这是一种OutOfMemoryException手段

rect 在源位图边界之外

where rect是该Bitmap.Clone方法的第一个参数.

因此,请检查cropArea参数是否大于图像.

在GDI +中,OutOfMemoryException并不意味着"内存不足"; GDI +错误代码OufOfMemory已被重载以表示不同的事情.其原因具有历史意义,Hans Passant在另一个答案中对此进行了详细描述.

  • 多么愚蠢地使用`OutOfMemoryException` (5认同)