创建位图时C#内存不足

我正在创建一个应用程序(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; } 

失败并具有Out of Memoryexception的行是:

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

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

谢谢你的协助。

在C#成像中内存不足,通常是错误的矩形或点的标志 – 一点红鲱鱼 。 我敢打赌,当发生错误或者Size.Hight + Y或Size.Width + X大于图像的高度或宽度时, start会有负X或Y.

MSDN解释说OutOfMemoryException意味着

rect位于源位图边界之外

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

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

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

像这样使用Bitmap对象:

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

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

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

如果要反复创建新的位图,则可能需要调用GC.Collect(); 这将迫使C#进行垃圾收集