Я пишу приложение для чтения в очень большом TIF-файле (15000x10000), а затем делю его на фрагменты размером 256x256, которые сохраняются в формате JPEG.Я пытаюсь использовать объекты WPF windows.media.imaging для измельчения.Приведенный ниже пример работает нормально и извлекает для меня несколько плиток (для этого примера он получает несколько копий одной и той же плитки), но приложение использует память, и эта память никогда не освобождается.Даже принудительное тестирование CG.Collect по-прежнему не освобождает память.
Dim croppedImage As CroppedBitmap
Dim strImagePath As String = "C:\Huge.tif"
Dim imageSource As BitmapSource = TiffBitmapDecoder.Create(New Uri(strImagePath), BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.None).Frames(0) 'CreateImage(imageBytes, 0, 0)
Dim enc As JpegBitmapEncoder
Dim stream As FileStream
For i As Integer = 0 To 5000
croppedImage = New CroppedBitmap()
croppedImage.BeginInit()
croppedImage.Source = imageSource
croppedImage.SourceRect = New Int32Rect(0, 0, 256, 256)
croppedImage.EndInit()
enc = New JpegBitmapEncoder()
enc.QualityLevel = 70
enc.Frames.Add(BitmapFrame.Create(croppedImage))
stream = New FileStream("C:\output\" & i & ".jpg", FileMode.Create, FileAccess.Write)
enc.Save(stream)
stream.Close()
enc = Nothing
stream = Nothing
croppedImage.Source = Nothing
croppedImage = Nothing
Next
imageSource = Nothing
Я что-то упустил здесь?Как я могу обеспечить правильное освобождение этих ресурсов?
Спасибо
Дополнительная информация:
Ответы, приведенные ниже, определенно помогут.Спасибо за это.У меня есть еще одна проблема, чтобы добавить к этому сейчас.Я пытаюсь сделать водяной знак на каждой плитке перед ее сохранением, добавив следующий код:
Dim targetVisual = New DrawingVisual()
Dim targetContext = targetVisual.RenderOpen()
targetContext.DrawImage(croppedImage, New Rect(0, 0, tileWidth, tileHeight))
targetContext.DrawImage(watermarkSource, New Rect(0, 0, 256, 256))
Dim target = New RenderTargetBitmap(tileWidth, tileHeight, 96, 96, PixelFormats.[Default])
targetContext.Close()
target.Render(targetVisual)
Dim targetFrame = BitmapFrame.Create(target)
Это начинает использовать серьезную память.При работе с большим TIF используется более 1200 МБ памяти, как сообщает диспетчер задач.Похоже, что эта память в конце концов освобождается, но я немного обеспокоен тем, что с кодом что-то не так, и есть ли возможность остановить его, потребляя всю эту память в первую очередь.Возможно, это просто вопрос, который обсуждал Фрэнси?
Андрей