gpt4 book ai didi

c# - 异步加载 BitmapSource 图像时内存泄漏

转载 作者:太空狗 更新时间:2023-10-30 01:11:29 26 4
gpt4 key购买 nike

我有相当多的图像要加载到我的 WPF 应用程序的列表框中。最初我使用 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 只是从路径中获取 Bitmap,然后转换为 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;
}
}

最佳答案

我认为您误解了 TransformedBitmap 的工作原理。它保留对源位图的引用,并在内存中对其进行转换。也许您可以将转换后的位图编码为内存流,然后立即将其读回。我不确定这有多快,但你不会再坚持全尺寸位图。

我找到了这个 blog post返回一个以 TransformedBitmap 作为源的 WriteableBitmap。 WriteableBitmap 会将像素数据复制到初始化程序中的内存缓冲区,因此它实际上并不保留对 TransformedBitmap 或全尺寸图像的引用。

关于c# - 异步加载 BitmapSource 图像时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com