Загрузить изображение в память немедленно - PullRequest
2 голосов
/ 14 ноября 2009

Мне нужно открыть все кадры из изображения Tiff в WPF в память, а затем удалить источник. И после этого мне в конечном итоге нужно отрендерить это изображение (измененное в соответствии с размером окна). Мое решение довольно медленное, и я не могу удалить исходный файл до первого запроса. Какие-нибудь лучшие практики?

Ответы [ 2 ]

7 голосов
/ 14 ноября 2009

Использование CacheOption = BitmapCacheOption.OnLoad

Этот параметр можно использовать со свойством BitmapImage.CacheOption или в качестве аргумента для BitmapDecoder.Create() Если вы хотите получить доступ к нескольким кадрам после загрузки изображений, вам придется использовать BitmapDecoder.Create. В любом случае файл будет загружен полностью и закрыт.

Смотрите также мой ответ на этот вопрос

Обновление

Следующий код отлично работает для загрузки всех кадров изображения и удаления файла:

var decoder = BitmapDecoder.Create(new Uri(imageFileName), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
List<BitmapFrame> images = decoder.Frames.ToList();
File.Delete(imageFileName);

Вы также можете получить доступ к декодеру. Конечно же, после удаления файла.

Этот вариант также работает, если вы предпочитаете открывать поток самостоятельно:

List<BitmapFrame> images;
using(var stream = File.OpenRead(imageFileName))
{
  var decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
  images = decoder.Frames.ToList();
}
File.Delete(imageFileName);

В любом случае это более эффективно, чем создание MemoryStream, поскольку MemoryStream сохраняет в памяти сразу две копии данных: декодированную и не декодированную копию.

0 голосов
/ 18 ноября 2009

Я понял это. Я должен использовать MemoryStream :

MemoryStream ms = new MemoryStream(File.ReadAllBytes(image));
TiffBitmapDecoder decoder = new TiffBitmapDecoder(ms, BitmapCreateOptions.None, BitmapCacheOption.None);
List<BitmapFrame> images = new List<BitmapFrame>();
foreach (BitmapFrame frame in decoder.Frames) images.Add(frame);
...