我在vb.net中制作的照片编辑器中出现了内存异常。位图图像不断变化,在将其发送到另一个位图之后我总是Dispose()。它是存储在临时文件夹中并耗尽了我在计算机上的所有空间,还是什么?在绘制了大约8个位图后,它总是会出错。
我该如何解决这个问题?这是一个相当严重的问题。
答案 0 :(得分:2)
处置与记忆无关。内存是一种托管资源,处理非托管资源,如GDI句柄。如果你有一个像字典这样的全局结构或你添加它们的东西,你可能会“泄漏”引用而不允许垃圾收集器找到它们。
在这些情况下,调用GC.Collect()来尝试清理它们通常很诱人。知道这对你没有帮助。如果垃圾收集器能够清理内存,它会。如果要收集的对象仍然在某处,则调用GC.Collect()不会更改内容。
查看评论中的链接,这可能会更好一点(根据链接中的评论改编):
''# Crop a bitmap
<Extension()> _
Public Function Crop(ByVal source As Bitmap, _
ByVal cropX As Integer, ByVal cropY As Integer, _
ByVal cropWidth As Integer, ByVal cropHeight As Integer) As Bitmap
''# parameter checking/guard clauses
If source Is Nothing Then Throw New ArgumentNullException()
If cropX > source.Width Then Throw New InvalidArgumentException("cropX")
If cropY > source.Height Then Throw New InvalidArgumentException("cropY")
If cropX < 0 Then cropX = 0
If cropY < 0 Then cropY = 0
cropWidth = Math.Min(cropWidth, source.Width - cropX)
cropHeight = Math.Min(cropHeight, source.Height - cropY)
''# Create the new bitmap and associated graphics object
Dim bmp As New Bitmap(cropWidth, cropHeight)
Using g As Graphics = Graphics.FromImage(bmp)
''# Draw the specified section of the source bitmap to the new one
g.DrawImage(source, New Rectangle(0, 0, cropWidth, cropHeight), cropX, cropY, cropWidth, cropHeight, GraphicsUnit.Pixel)
End Using
''# Return the bitmap
Return bmp
End Function
我认为您的问题在其他地方,但这段代码仍然可能更好一些。
答案 1 :(得分:0)
听起来不像8位图就足以让你的记忆充满。或者他们是巨大的位图?
我发现大多数内存不足的异常实际上都不是内存异常,而是它们在某种程度上是内存损坏的结果。 (我处理了很多非托管代码和PInvokes,所以这对我来说很常见。)
您确定需要处理图像吗?垃圾收集器是否自动处理位图?