我在我的WPF应用程序中将许多图像加载到ListBox中。最初,我使用GDI来调整图像的大小(原始图像占用太多内存)。这很好,但每个图像需要大约400毫秒。这不太好。因此,我寻找另一种解决方案,我找到了一种使用TransformedBitmap(继承自BitmapSource)的方法。我认为这很棒,我可以使用它。但现在我遇到了某些内存泄漏问题...
我正在使用BackgroundWorker异步加载图像,如下所示:
BitmapSource bs = ImageUtils.ResizeBitmapSource(ImageUtils.GetImageSource(photo.FullName));
//BitmapSource bs = ImageUtils.GetImageSource(photo.FullName);
bs.Freeze();
this.dispatcher.Invoke(new Action(() => { photo.Source = bs; }));
GetImageSource函数从路径获取位图,然后转换为BitmapSource。
以下是ResizeBitmapSource的代码片段:
const int thumbnailSize = 200;
int width;
int height;
if (bs.Width > bs.Height)
{
width = thumbnailSize;
height = (int)(bs.Height * thumbnailSize / bs.Width);
}
else
{
height = thumbnailSize;
width = (int)(bs.Width * thumbnailSize / bs.Height);
}
BitmapSource tbBitmap = new TransformedBitmap(bs,
new ScaleTransform(width / bs.Width,
height / bs.Height, 0, 0));
return tbBitmap;
这段代码本质上是从以下链接中获取的: http://rongchaua.net/blog/c-wpf-fast-image-resize/
有什么想法可能导致泄漏吗?
编辑: 如所请求,以下是GetImageSource的代码:
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
using (var bmp = Image.FromStream(stream, false, false))
{
// Use WPF to resize
var bitmapSource = ConvertBitmapToBitmapSource(bmp);
bitmapSource = ResizeBitmapSource(bitmapSource);
return bitmapSource;
}
}
ImageUtils.GetImageSource()
的代码?我怀疑内存泄漏就是在那里发生的。 - Alastair Pitts