【问题标题】:WPF BitmapImage Memory ProblemWPF BitmapImage 内存问题
【发布时间】:2010-09-29 08:04:11
【问题描述】:

我的 WPF 应用程序具有多个画布和大量按钮。用户可以加载图片来改变按钮背景。

这是我在 BitmapImage 对象中加载图像的代码

bmp = new BitmapImage();
bmp.BeginInit();
bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.UriSource = new Uri(relativeUri, UriKind.Relative);
bmp.EndInit();

并且在 EndInit() 应用程序的内存增长非常快。

让思考变得更好(但并不能真正解决问题)的一件事是添加

bmp.DecodePixelWidth = 1024;

1024 - 我的最大画布尺寸。但我应该只对宽度大于 1024 的图像执行此操作 - 那么如何在 EndInit() 之前获得宽度?

【问题讨论】:

    标签: wpf memory bitmapimage


    【解决方案1】:

    通过将图像加载到 BitmapFrame 中,我认为您只需阅读元数据即可。

    private Size GetImageSize(Uri image)
    {
        var frame = BitmapFrame.Create(image);
        // You could also look at the .Width and .Height of the frame which 
        // is in 1/96th's of an inch instead of pixels
        return new Size(frame.PixelWidth, frame.PixelHeight);
    }
    

    然后你可以在加载BitmapSource时执行以下操作:

    var img = new Uri(ImagePath);
    var size = GetImageSize(img);
    var source = new BitmapImage();
    source.BeginInit();
    if (size.Width > 1024)
        source.DecodePixelWidth = 1024;
    source.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
    source.CacheOption = BitmapCacheOption.OnLoad;
    source.UriSource = new Uri(ImagePath);
    source.EndInit();
    myImageControl.Source = source;
    

    我对此进行了几次测试,并查看了任务管理器中的内存消耗,差异很大(在 10MP 的照片上,我通过以 1024 像素而不是 4272 像素宽度加载它节省了近 40MB 的私有内存)

    【讨论】:

    • 哇,这给我带来的改变真是令人印象深刻——不仅在内存使用方面,而且在性能方面也是如此。感谢您提供非常简单明了的答案 - 对于照片库文件浏览器,仅此一项就解决了我遇到的许多问题!
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 2015-07-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2023-03-28
    • 2014-05-18
    • 1970-01-01
    相关资源
    最近更新 更多