2016-05-22 5 views
0

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

У меня есть класс PhotoCollection: ObservableCollection < фото > {}, где класс фотография создает BitmapImage объект:

PhotoCollection Класс:

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 

} 

Когда я перетаскиваю изображения на своем компьютере в список, ph otos загружаются в PhotoCollection of Photos и отображаются в списке (благодаря привязке). Если я сброшу 50 МБ фотографий, моя программа займет ~ 50 МБ памяти.

Проблема у меня есть, я должен удалить эти фотографии из папки позже. Для этого сначала нужно выгрузить или удалить фотографии в памяти, потому что BitmapImage блокирует файлы. Я не могу понять, как это сделать.

Я подумал, найдя это похожее StackOverFlow Question, что все мои проблемы были решены. Реализация коды Вопроса в 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. Использование памяти резко возросло! Как 50MBs фотографий занял 1 Гб оперативной памяти и потребовалось 10 раз дольше нагрузка:

Link to Image

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

Большое спасибо!^_^

ответ

0

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

+0

Благодарим за ответ! Теперь я чувствую себя идиотом.^_ ^ – user3732456

Смежные вопросы