2016-03-14 1 views
0

Je travaille sur un projet Tiff Viewer qui traite de gros fichiers tif couleur 24 bits (> 70MB). Voici le code que je charger le fichier TIF:tiff viewer application wpf à court de mémoire

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

J'utilise l'option de cache par défaut pour empêcher le chargement du fichier entier en mémoire.

Mon application a une vue de miniatures latérale (StackPanel vertical avec Image), et une vue de page qui affiche la miniature sélectionnée.

Je ne charger que les vignettes visibles par ce code:

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; 
    } 
} 

Mon problème est quand je faire défiler les vignettes voir pour charger les nouvelles pages visibles, la charge de la mémoire augmente et je tombe de mémoire!

J'ai essayé de décharger des pages invisibles (qui étaient déjà chargées) mais ça n'aide pas!

img.Source = null 

Merci de m'avoir aidé à comprendre cela.

+0

J'ai trouvé un article [ici] (http://code.logos.com/blog/2010/08/tracking_bitmapsource_memory_usage.html) parle de ce problème, mais je ne sais pas comment l'adapter à mon propre code. Une idée ? – hsnslh

Répondre

0

Je l'ai compris! Comme mentionné dans mon précédent commentaire, this article m'a beaucoup aidé. Je l'ai juste adapté à mon code et la mémoire est maintenant déchargée correctement. Voici les modifications que j'ai fait à mon code:

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; 
    } 
}