vb.net图形绘制内存不足的图像
我尝试减小图像文件大小,起初一切正常vb.net图形绘制内存不足的图像,.net,vb.net,.net,Vb.net,我尝试减小图像文件大小,起初一切正常 但在减少第14-15个文件后,代码抛出错误“内存不足” 在pic.DrawImage(img,0,0,宽度,高度) 和jpeg.Save(exePath&“\”&dir\u文件&re12.Name,Imaging.ImageFormat.jpeg) 我已经添加了tp.Dispose()&pic.Dispose(),但它不起作用 这是我的密码 Private Sub imgreduce_DoWork(sender As Object, e As
但在减少第14-15个文件后,代码抛出错误“内存不足”
在
pic.DrawImage(img,0,0,宽度,高度)
和
jpeg.Save(exePath&“\”&dir\u文件&re12.Name,Imaging.ImageFormat.jpeg)
我已经添加了tp.Dispose()
&pic.Dispose()
,但它不起作用
这是我的密码
Private Sub imgreduce_DoWork(sender As Object, e As DoWorkEventArgs) Handles imgreduce.DoWork
Dim reduce12 = New System.IO.DirectoryInfo(exePath & "\" & dir_file).GetFiles("file_*.jpeg").OrderBy(Function(x) x.Name)
For Each re12 As System.IO.FileInfo In reduce12
Dim jpeg As Image = Image.FromFile(exePath & "\" & dir_file & re12.Name)
Dim tp As Bitmap = reduce(jpeg, jpeg.Width, jpeg.Height)
jpeg.Dispose()
jpeg = tp
jpeg.Save(exePath & "\" & dir_file & re12.Name, Imaging.ImageFormat.Jpeg)
Next
End Sub
Private Function reduce(ByVal img As Image, ByVal width As Integer, ByVal height As Integer) As Image
Dim imaf As New Bitmap(width, height)
Dim pic As Graphics = Graphics.FromImage(imaf)
pic.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
pic.DrawImage(img, 0, 0, width, height)
Return imaf
End Function
问题解决了
Private Sub imgreduce_DoWork(sender As Object, e As DoWorkEventArgs) Handles imgreduce.DoWork
Dim reduce12 = New System.IO.DirectoryInfo(exePath & "\" & dir_file).GetFiles("file_*.jpeg").OrderBy(Function(x) x.Name)
For Each re12 As System.IO.FileInfo In reduce12
Dim jpeg As Image = Image.FromFile(exePath & "\" & dir_file & re12.Name)
Using newImage As Bitmap = New Bitmap(reduce(jpeg, jpeg.Width, jpeg.Height))
jpeg.Dispose()
jpeg = newImage
jpeg.Save(exePath & "\" & dir_file & re12.Name, Imaging.ImageFormat.Jpeg)
jpeg.Dispose()
newImage.Dispose()
GC.Collect()
End Using
jpeg.Dispose()
GC.Collect()
Next
End Sub
Private Function reduce(ByVal img As Image, ByVal width As Integer, ByVal height As Integer) As Image
GC.Collect()
Dim imaf As Bitmap = New Bitmap(width, height)
Using pic As Graphics = Graphics.FromImage(imaf)
pic.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
pic.DrawImage(img, 0, 0, width, height)
GC.Collect()
End Using
Return imaf
imaf.Dispose()
GC.Collect()
End Function
Save()之后缺少Dispose()调用,该调用不会持续很长时间。一定要练习使用
using
语句。也不清楚这将如何减小图像大小。您正在加载JPEG文件,然后图像被绘制到另一个相同大小的位图中,并保存到另一个文件中。这就是这个过程应该做的吗?底线是:始终处理使用GDI+对象(图形、笔、画笔、图像等)的所有.NET类型。这里显示的代码可能只是症状,而不是原因——特别是如果整个应用程序没有处理GDI+对象。进程可以拥有的GDI+对象的数量有一个硬限制(默认值为10000);再创建一个对象,就会得到OOM异常。首先,确保所有支持它的对象都已被释放,正如前面所建议的那样。如果仍然存在相同的问题,则可能需要断断续续地显式调用GC.Collect
。通常应该避免这种情况,但我认为创建大量的图像是必要的。例如,您可以在每十次调用reduce
后调用它,或者您可以捕获那些内存不足的异常,然后调用它。为什么要将tp
分配给jpeg
,然后在jpeg
上调用Save
,而您可以在tp
上调用Save
?