2016-03-14 4 views
0

Я работаю над проектом Tiff Viewer, который имеет дело с большими 24-битными TIF-файлами (> 70 МБ). Вот код, как я загружаю файл TIF:tiff viewer приложение wpf из памяти

TiffBitmapDecoder tbd = new TiffBitmapDecoder(new Uri(_strTiffPath),BitmapCreateOptions.DelayCreation, BitmapCacheOption.Default); 
_frames = tbd.Frames; 

я использую вариант кэша по умолчанию, чтобы предотвратить загрузку всего файла в память.

Мое приложение имеет вид миниатюр (вертикальный StackPanel с изображением) и вид страницы, который отображает выбранный эскиз.

загружает только видимые миниатюры с помощью этого кода:

internal static BitmapSource GetThumbAt(int i) 
{ 
    try 
    { 
     if (i >= _frames.Count) 
      return null; 

     BitmapFrame bf = _frames[i]; 
     bf.Freeze(); 
     return bf; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 

Моей проблемы когда я прокручиваю вниз эскизы просмотр, чтобы загрузить новые видимые страницы, увеличивается нагрузка на память и я бег в из памяти!

Я попытался выгрузить невидимые страницы (которые уже были загружены), но это не поможет!

img.Source = null 

Спасибо, что помогли мне разобраться в этом.

+0

Я нашел статью [здесь] (http://code.logos.com/blog/2010/08/tracking_bitmapsource_memory_usage.html) говорить об этой проблеме, но я не знаю, как адаптировать его к своему собственному коду. Есть идеи ? – hsnslh

ответ

0

Я понял! Как уже упоминалось в моем предыдущем комментарии, this article мне очень помог. Я только что адаптировал его к своему коду, и память теперь выгружается правильно. Вот модификации, которые я сделал в моем коде:

internal static BitmapSource GetThumbAt(int i) 
{ 
    try 
    { 
     if (i >= _frames.Count) 
      return null; 

     BitmapFrame bf = _frames[i]; 
     BitmapSource bs = bf.Clone() as BitmapSource; //make a copy of the original because bf is frozen and can't take any new property 
     BitmapUtility.AddMemoryPressure(bs); 
     return bs; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
}