C#创建位图选择区时内存不足)。我想添加一个放大的“预览窗格”,以便用户可以更精确地选择他们想要的区域(更大的像素)。在mousemove事件中,我有以下代码...privatevoidfalseDesktop_MouseMove(objectsender,MouseEventArgse){zoomBox.Invalidate();bmpCrop.Dispose();}privateImageshowZoomBox(PointcurLocation){Pointstart=newPoint(curLocation.X-50,curLocation.Y-50);尺寸size=newSize(100,90);矩形rect=newRectangle(start,size);图片选择=cropImage(falseDesktop.Image,rect);返回选择;}私有静态位图bmpCrop;privatestaticImagecropImage(Imageimg,RectanglecropArea){if(cropArea.Width!=0&&cropArea.Height!=0){位图bmpImage=新位图(img);bmpCrop=bmpImage.Clone(cropArea,bmpImage.PixelFormat);bmpImage.Dispose();返回(图像)(bmpCrop);}返回空值;因内存不足异常而失败的行是:bmpCrop=bmpImage。克隆(cropArea,bmpImage.PixelFormat);基本上它所做的是围绕鼠标指针取一个100x90的矩形并将其拉入zoomBox,它是一个图片框控件。但是,在此过程中,出现内存不足错误。我在这里做错了什么?感谢您的帮助。在C#成像中内存不足通常是矩形或点损坏的标志-有点转移注意力。我敢打赌,当出现问题或Size.Height+Y或Size.Width+X大于图像的高度或宽度时,start将具有负X或Y。MSDN解释说OutOfMemoryException意味着rect在源位图的边界之外,其中rect是Bitmap.Clone方法的第一个参数。因此检查cropArea参数是否大于图像。在GDI+中,OutOfMemoryException并不意味着“内存不足”;GDI+错误代码OufOfMemory已被超载以表示不同的含义。这是历史原因,HansPassant在另一个答案中有详细描述。像这样使用Bitmap对象:using(BitmapbmpImage=newBitmap(img)){//DosomethingwiththeBitmapobject}你应该检查curLocation.X是否大于50,否则你的矩形将从负区域开始(和coursecurLocation.Y)如果缩放框超出桌面区域的边缘,那么当您尝试裁剪时,您是在要求系统制作一个包含视频内存区域之外的像素的新图像。确保限制缩放框,使其范围不小于0或大于屏幕边缘。如果您重复创建新的位图,您可能需要调用GC.Collect();这将强制C#执行垃圾收集。会用到,需要详细了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
