我有以下代码将图像调整为特定大小:
Public Sub ResizeBitmap(ByRef uSource As Bitmap, ByVal uSize As Size)
Dim nBmp As New Bitmap(uSize.Width, uSize.Height)
Using g As Graphics = Graphics.FromImage(nBmp)
g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
g.DrawImage(uSource, New Rectangle(0, 0, uSize.Width, uSize.Height))
End Using
uSource = nBmp
End Sub
如果我经常调用此方法,则会遇到Unknown GDI +异常,但不是内存不足异常。 由于GDI +的错误并不总是很清楚,因此我怀疑无论如何内存泄漏,因为TaskManager显示正在使用的RAM数量不断增加。
因此,我想问一下上面的代码是否包含任何缺陷,如果是,则如何消除它们。
我认为我在内存管理方面还算不错,但是位图有时确实使我达到了极限。
谢谢。
答案 0 :(得分:1)
我认为您遇到的泄漏是在子例程中间将编辑:对此评论的友善评论,uSource
设置为其他值时发生的,虽然可以,但是也可能导致问题。也许比我更懂行的人可以填补vb.net如何处理此问题的空缺。ByRef
是造成泄漏的原因。自从问问者(Asker)将此标记为有帮助后,我将其余答案保持不变,并且我认为这是很好的常规做法。
使用这种类型的操作时,通常最好使用Function
而不是Sub
(正如@Reza Aghaei在评论中建议的那样)。
将Sub
更改为Function
,然后在末尾添加as Bitmap
以定义返回类型。记住也要更改End
标签。您得到:
Public Function ResizeBitmap(ByVal uSource As Bitmap, ByVal uSize As Size) as Bitmap
'/.../
End Function
这将允许您在(完成)功能中执行以下操作:
Public Function ResizeBitmap(ByVal uSource As Bitmap, ByVal uSize As Size) as Bitmap
Dim nBmp As New Bitmap(uSize.Width, uSize.Height)
Using g As Graphics = Graphics.FromImage(nBmp)
g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
g.DrawImage(uSource, New Rectangle(0, 0, uSize.Width, uSize.Height))
End Using
Return nBmp
End Function
...并根据需要在代码中的其他位置使用Dim bSmall as Bitmap = ResizeBitmap(bBig, New Size(250,250))
调整图像大小。