0

我的问题:有没有办法将图像加载到不会占用大量内存并且仍然可以删除图像的 BitmapImage 中?阅读下文了解更多详情:

我有一个 PhotoCollection 类:ObservableCollection<Photo>{ },其中 Photo 类创建了一个 BitmapImage 对象:

照片收藏类:

public class PhotoCollection : ObservableCollection<Photo>
{
    ...Stuff in here...
}

照片类:

public class Photo
{
    public Photo(string path)
    {
        _path = path;
        _source = new Uri(path);

        BitmapImage tmp = new BitmapImage();
        tmp.BeginInit();
        tmp.UriSource = _source;
        tmp.CacheOption = BitmapCacheOption.None;
        tmp.DecodePixelWidth = 200;
        tmp.DecodePixelHeight = 200;
        tmp.EndInit();

        BitmapImage tmp2 = new BitmapImage();
        tmp2.BeginInit();
        tmp2.UriSource = _source;
        tmp2.CacheOption = BitmapCacheOption.None;
        tmp2.EndInit();

        _image = BitmapFrame.Create(tmp2, tmp);
        _metadata = new ExifMetadata(_source);

    }
    public BitmapFrame _image;
    public BitmapFrame Image { get { return _image; } set { _image = value; } }

    ...More Property Definitions used to support the class

}

当我将计算机上的图像拖放到列表框中时,照片会加载到照片的 PhotoCollection 中并显示在列表框中(感谢 Binding)。如果我丢弃 50MB 的照片,我的程序会占用大约 50MB 的内存。

我遇到的问题是我需要稍后从文件夹中删除这些照片。为此,我必须先卸载或处理内存中的照片,因为 BitmapImage 会锁定文件。我无法弄清楚如何做到这一点。

在找到这个类似的 StackOverFlow 问题后,我认为我的所有问题都已解决。实现 StackOverFlow 问题中的代码:

 public class Photo
 {
    public Photo(string path)
    {
        BitmapImage tmp = new BitmapImage();
        BitmapImage tmp2 = new BitmapImage();
        tmp = LoadImage(_path);
        tmp2 = LoadImage(_path);
        ...
    }
    private BitmapImage LoadImage(string myImageFile)
    {
        BitmapImage myRetVal = null;
        if (myImageFile != null)
        {
            BitmapImage image = new BitmapImage();
            using (FileStream stream = File.OpenRead(myImageFile))
            {
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.StreamSource = stream;
                image.EndInit();
            }
            myRetVal = image;
        }
        return myRetVal;
    }
 ...
 }

实现 FileStream 以将图像加载到 BitMapImage 对象中只有一个巨大的问题。我的记忆力猛增!就像 50MB 的照片占用了 1GB 的内存并且加载时间延长了 10 倍:

链接到图片

重申我的问题:有没有办法将图像加载到不会占用大量内存并且仍然可以删除图像的 BitmapImage 中?

非常感谢!^_^

4

1 回答 1

1

您可以设置 的DecodePixelWidthDecodePixelHeight属性BitmapImage来告诉它加载更少的像素到内存中。

于 2016-05-22T03:09:14.860 回答