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