我正在寫一個應用程序來讀取一個非常大的tif文件(15000x10000),然後將它切成256x256的拼貼圖,並保存爲jpeg。我正在嘗試使用WPF windows.media.imaging對象來做斬波。下面的例子運行正常,並會爲我抽取一些圖塊(它只是獲得同一個圖塊的多個副本),但是應用程序使用了內存,並且內存永遠不會被釋放。即使強制一個CG.Collect來測試,這仍然不能釋放內存。WPF圖像處理 - 內存永遠不會釋放
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時使用了超過1200MB的內存。看起來這個內存最終會被釋放,但是我略微擔心代碼中的某些內容不正確,並且無論如何阻止它首先消耗所有這些內存。也許這只是歸結於Franci所討論的問題?
安德魯
感謝您的輸入。我想我需要更多地瞭解垃圾收集器以及它是如何工作的。 – 2010-11-08 10:33:54