C# WPF релиз BitmapImage без использования FileStream

Мой вопрос: существует ли способ загрузки изображений в BitmapImage, который не будет занимать огромный объем памяти, и изображения все еще можно будет удалить? Читайте ниже для более подробной информации:

У меня есть класс PhotoCollection: ObservableCollection {}, где класс 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

}

Когда я перетаскиваю изображения на моем компьютере в список, фотографии загружаются в Фотоколлекцию фотографий и отображаются в списке (благодаря привязке). Если я сбрасываю 50 МБ фотографий, моя программа занимает ~50 МБ памяти.

У меня проблема, мне нужно позже удалить эти фотографии из папки. Чтобы сделать это, я должен сначала выгрузить или утилизировать фотографии в памяти, потому что 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. Моя память использовать взлетела! Примерно 50 МБ фотографий занимали 1 ГБ памяти и загружались в 10 раз дольше:

Ссылка на изображение

Повторяю мой вопрос: существует ли способ загрузки изображений в BitmapImage, который не будет занимать огромный объем памяти, и изображения все еще можно будет удалить?

Спасибо! ^_^

1 ответ

Решение

Вы можете установить DecodePixelWidth а также DecodePixelHeight свойства BitmapImage сказать ему, чтобы загрузить меньше пикселей в память.

Другие вопросы по тегам