当前位置: 首页 > 编程语言 > C#

ImageList-ImageOutOfMemoryException分享

时间:2023-04-10 14:32:24 C#

ImageList/ImageOutOfMemoryException在从ImageList获取图片时遇到OutOfMemoryException,一直找不到合适的解决方法。我有一个自定义ListView控件,它附加了一个用于绘制ListViewItems的事件。然后调用静态方法绘制项目。对于大约300个项目的ListView,每次滚动ListView时我们都会获得大约100Mb的内存。违规代码已追踪到以下内容:Imageimage=item.ImageList.Images[item.ImageKey];if(image!=null){SizeimageOffset=newSize((bounds.Width-image.Width)/2,2);点imagePosition=bounds.Location+imageOffset;graphics.DrawImageUnscaled(image,imagePosition);似乎(当然是在WinXP上)垃圾回收工作不正常,导致内存螺旋上升。我们尝试在代码块之后直接添加一个image.Dispose()来解决问题,但没有效果。到目前为止,我设法找到的唯一解决方案是在静态方法末尾调用GC.Collect()。然而,问题在于它会导致ListView缓慢地重新绘制自身,并且当您尝试重新绘制时最终会在屏幕上出现伪影。还有其他人经历过吗?或者知道解决方法?你在处理图形吗?此外,您正在按照您提到的方式处理图像,那么您需要确保将其从ImageList中取出,否则会导致更多问题。图片的格式是什么?通常,当涉及图像时遇到内存不足问题时,您的问题将是某些方法不喜欢某种图像格式,或者9/10次,您误解了其中一个图形对象的生命周期。编辑:这是我能找到的最佳选择,使用ImageList.Draw(graphics,x,y,width,height,index)。这将使用内部句柄而不是创建图像的副本。我已经设法在我的应用程序中解决了这个问题。Jason有答案,你必须确保你使用“使用”块或它们的等价物。我使用VB,相当于使用Try...Catch...finally每当我创建一个新的位图时,调用BitMap.Dispose并在“Finally”部分设置Bitmap=nothing。从我尝试谷歌搜索的几个小时来看,这似乎是一个非常普遍的问题。下面的代码还允许任何图像在缩小为缩略图时保持其纵横比,这是谷歌难以解决的另一个问题!代码:以上是C#学习教程:ImageList/ImageOutOfMemoryException分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注—PrivateFunctionAspectedImage(ByValImagePathAsString,ByValSizeWantedAsInteger)AsImageDimmyBitmap,WhiteSpaceAsSystem.Drawing.BitmapDimmyGraphicsAsGraphicsDimmyDestinationAsRectangleDimMaxDimensionAsIntegerDimReductionRatioAsDoubleTry'创建一个基于文件的位图实例myBitmap=NewSystem.Drawing.Bitmap(ImagePath)'创建一个新的方形空白位图rightsizeIfmyBitmap.Height>=myBitmap.WidthThenMaxDimension=myBitmap.HeightElseMaxDimension=myBitmap.WidthReductionRatio=SizeWanted/MaxDimensionWhiteSpace=NewSystem.Drawing.Bitmap(SizeWanted,SizeWanted)'得到新空白的绘图面bitmapmyGraphics=Graphics.FromImage(WhiteSpace)'判断照片是横向还是纵向DimWhiteGapAsDoubleIfmyBitmap.Height>myBitmap.WidthThen'portraitWhiteGap=((myBitmap.Width-myBitmap.Height)/2)*-1myDestination=NewRectangle(x:=CInt(WhiteGap*ReductionRatio),y:=0,Width:=Int(myBitmap.Width*ReductionRatio),Height:=Int(myBitmap.Height*ReductionRatio))Else'landscapeWhiteGap=((myBitmap.Width-myBitmap.Height)/2)'创建目标矩形myDestination=NewRectangle(x:=0,y:=CInt(WhiteGap*ReductionRatio),Width:=Int(myBitmap.Width*ReductionRatio),Height:=Int(myBitmap.Height*ReductionRatio))EndIf'在白色方块上绘制图像myGraphics.DrawImage(image:=myBitmap,rect:=myDestination)AspectedImage=WhiteSpaceCatchexAsExceptionmyBitmap=NewSystem.Drawing.Bitmap("")AspectedImage=NewSystem.Drawing.Bitmap(4,4)ImageBufferExceeded=TrueMsgBox("超出图像缓冲区,内存中的图像太多。如果看不到您想要的图像,请重新启动应用程序并直接导航到您的图像")最后myBitmap.Dispose()myBitmap=NothingWhiteSpace=NothingEndTryEndFunction本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: