【发布时间】:2018-06-29 02:05:16
【问题描述】:
当我将图像分解为子图像时,我不断收到系统内存不足错误。没有什么太花哨的事情,只是将图像分成一堆较小的图像。这是我的代码:
Dim counterrr As Integer = 0
Dim sorucedir As String
Dim tardir As String
sorucedir = "C:\somedir\"
tardir = "C:\otherdir\"
Dim di2 As New DirectoryInfo(sorucedir)
Dim fiArr2 As FileInfo() = di2.GetFiles()
Dim fri2 As FileInfo
Dim hh As Integer
Dim ww As Integer
hh = 995 'height of source images
ww = 1080 'width of source images
Dim sizestepX As Integer = 180
Dim stepsizeY As Integer = 239
For i = 0 To ww - 1 Step sizestepX
For j = 0 To hh - 1 Step stepsizeY
For Each fri2 In fiArr2
Dim BM2 As Bitmap
BM2 = Image.FromFile(fri2.FullName)
''Threading.Thread.Sleep(3000)
'bm2 = Image.FromFile(fri2.FullName)
Dim BM3 As Bitmap
Dim rect As New Rectangle(i, j, sizestepX, stepsizeY)
BM3 = BM2.Clone(rect, Imaging.PixelFormat.DontCare)
counterrr += 1
Dim ss As String
ss = tardir & counterrr & ".png"
BM3.Save(ss, Imaging.ImageFormat.Png)
BM3 = Nothing
Next
Next
Next
创建少至 6 个图像后出现错误(创建第 7 个图像时发生)。抛出错误的行是这样的:
BM3 = BM2.Clone(rect, Imaging.PixelFormat.DontCare)
如何修改我的代码,使它们的对象被正确处理(?),这样它们就不会泄漏内存。
【问题讨论】:
-
使用
Using语句...如果该类型实现了 IDisposable 接口,则将该对象包装起来以便正确处理。 -
@Codexer 我试过同时使用 BM2 和 BM3,我仍然得到同样的错误。
-
另外,您的循环中有一个
FileInfo数组,您需要提取每个对象,不要创建变量来引用循环中的对象。删除fri2... 还有其他建议,但这不是代码审查。你的问题已经回答了,该怎么做...... -
另外,如果您尝试了
Using声明,您不认为您应该将其添加到您的帖子中,这很重要,因为有些人只是在您已经尝试过时浪费了时间来帮助您这个。另外,如果你这样做了,为什么上面的代码没有显示这个?