创建位图时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
位于源位图边界之外
其中rect
是Bitmap.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#进行垃圾收集