C# WPF релиз BitmapImage без использования FileStream
Мой вопрос: существует ли способ загрузки изображений в BitmapImage, который не будет занимать огромный объем памяти, и изображения все еще можно будет удалить? Читайте ниже для более подробной информации:
У меня есть класс PhotoCollection: ObservableCollection
Класс фотоколлекции:
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
сказать ему, чтобы загрузить меньше пикселей в память.