我正在写一个应用程序来读取一个非常大的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