gpt4 book ai didi

wpf - 释放用作图像控制源的 BitmapImages(内存问题)

转载 作者:行者123 更新时间:2023-12-05 00:15:42 24 4
gpt4 key购买 nike

我有一个简单的 WPF 窗口,下面有一个 Image 控件和一个 Slider 控件。当用户移动 slider 时,我正在加载各种图像并将其设置为图像控件的源。我得到了很多图像,大小不一,最大可达 200 KB,但是当我前后移动 slider 时,程序开始占用大量内存。成百上千兆的内存。大多数最终都会被垃圾回收,但不是全部。

也许 WPF 不是可行的方法,或者我应该强制使用 G/C?我已经尝试将图像加载为位图并使用 Imaging.CreateBitmapSourceFromHBitmap() 和 Win32-api 获取位图源以删除和处理等等,但我只是让事情变得更糟:)

我想我应该尝试获取现有图像源并以某种方式释放它,然后再加载和分配新图像。

有什么想法吗?

编辑

我正在添加一些运行良好的示例代码,并且似乎可以保持低内存:

    private Image _lastImage;

// Event when user moves the slider control, load image using the filname in
// the _images[] array which contains hundreds of images
private void SliderChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (_lastImage != null)
_lastImage.Dispose();

var image = Image.FromFile(_images[(int)ImageSlider.Value]);
Snapshot.Source = ImageToBitmapImage(image);

_lastImage = image;
}

private static ImageSource ImageToBitmapImage(Image image)
{
BitmapImage bitmapImage;
using (var ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Jpeg);
bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new MemoryStream(ms.ToArray());
bitmapImage.EndInit();
}
return bitmapImage;
}

最佳答案

强制 GC 收集确实很可怕。而是调用 Bitmap 对象的 .Dispose() 方法,这就是它的作用!

关于wpf - 释放用作图像控制源的 BitmapImages(内存问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5530645/

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