我正在创建一个应用程序(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错误。我在这里做错了什么?
感谢您的协助。
答案 0 :(得分:16)
C#成像内存不足,通常是错误的矩形或点的标志 - 有点红鲱鱼。我敢打赌start
发生错误时负X或Y 或尺寸。高+ Y或尺寸。宽度+ X大于图像的高度或宽度
答案 1 :(得分:8)
MSDN解释说OutOfMemoryException
表示
rect
位于源位图边界之外
其中rect
是Bitmap.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#进行垃圾回收