VB. net графический рисунок из памяти - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь уменьшить размер файла изображения, сначала все работает нормально
, но после уменьшения 14-15 файла выдается ошибка кода "out of memory"
при pic.DrawImage(img, 0, 0, width, height)
и jpeg.Save(exePath & "\" & dir_file & 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

1 Ответ

0 голосов
/ 24 апреля 2020

проблема решена!

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...