2010-03-15 9 views
1

J'ai un problème de mémoire lorsque j'essaie de charger quelques images dans une seule image.Mémoire insuffisante avec plusieurs images dans une seule image

public void button2_Click(object sender, EventArgs e) 
    { 


     FolderBrowserDialog dialog = new FolderBrowserDialog(); 
     dialog.ShowDialog(); 
     string selected = dialog.SelectedPath; 

     string[] imageFileList = Directory.GetFiles(selected); 


     int iCtr = 0,zCtr = 0; 
     foreach(string imageFile in imageFileList) 
     { 

      if (Image.FromFile(imageFile) != null) 
      { 
       Image.FromFile(imageFile).Dispose(); 
      } 

      PictureBox eachPictureBox = new PictureBox(); 

      eachPictureBox.Size = new Size(100,100); 
      // if (iCtr % 8 == 0) 
      //{ 
      // zCtr++; 
       // iCtr = 0; 
      //} 
      eachPictureBox.Location = new Point(iCtr * 100 + 1, 1); 
      eachPictureBox.Image = Image.FromFile(imageFile); 
      iCtr++; 

      panel1.Controls.Add(eachPictureBox); 

     } 


    }`enter code here` 
+0

Combien d'images sont stockées dans le répertoire que vous sélectionnez? – Aaron

+0

Vous chargez plusieurs images, mais chacune dans chaque zone d'image. Alors, quel est le code d'erreur? un essai attraper ce que le rendement ?? Peut-être trop d'images? – gbianchi

+0

70 images jpg –

Répondre

1
if (Image.FromFile(imageFile) != null) 
{ 
    Image.FromFile(imageFile).Dispose(); 
} 

Bad. Vous chargez l'image à partir du fichier, en vérifiant si le résultat est nul ... puis en le chargeant à nouveau dans un nouveau résultat afin de pouvoir le mettre au rebut. Alors que la dernière partie est stupide, ce n'est pas dangereux. La première partie est, cependant, que le Image résultant n'est jamais correctement éliminé (si/quand le GC le recueille, le finaliseur sur le Image type devrait disposer des ressources non managées, mais ce n'est pas une bonne chose à compter sur). Incidemment, Image.FromFile ne retournera jamais null. S'il ne peut pas lire l'image, il lancera un OutOfMemoryException.

Le code semble également ne rien faire, car il n'y a pas de bloc else et rien de significatif n'est fait dans le bloc if.

Je pense que votre OutOfMemoryException provient du fait que l'un ou plusieurs des fichiers dans ce répertoire est stocké dans un format d'image corrompu ou non pris en charge, ou n'est pas une image du tout.

Essayez de remplacer le code dans votre foreach avec ceci:

try 
{ 
    Image image = Image.FromFile(imageFile); 

    PictureBox eachPictureBox = new PictureBox(); 

    eachPictureBox.Size = new Size(100,100); 

    eachPictureBox.Location = new Point(iCtr * 100 + 1, 1); 
    eachPictureBox.Image = Image.FromFile(imageFile); 
    iCtr++; 

    panel1.Controls.Add(eachPictureBox); 
} 
catch(OutOfMemoryException) { } // skip the file 
+0

ok mais sans ce code je suis aussi hors de la mémoire :( –

+0

Quelle est la taille de ces fichiers? –

+0

thx, maintenant de travail :) –

0

Quelque chose que vous devez considérer que quel que soit le type d'image stockée sur le disque, lorsque vous ouvrez pour afficher l'image deviendra un bitmap et nécessite 4 octets par pixel affiché.

Votre code semble suggérer une tentative d'opération de miniatures. Vous êtes en train de charger 70 fichiers dans la mémoire et quelle que soit la taille de l'affichage, ils seront très volumineux en mémoire. Par exemple, supposons que vous ayez 70 jpeg à une profondeur de couleur de 32 bits et que vous ayez une taille de 1920 x 1080 pixels. Votre exigence de mémoire pour charger que de nombreuses images à la fois est alors:

70 pics x 1920 pixels x 1080 pixels x 4 bytes/pixel = 580,608,000 bytes! 

Et c'est une estimation assez faible.

Vous pouvez envisager de charger beaucoup moins d'images ou d'essayer une solution de thumbnailing réelle.

1

La zone d'image contient en interne une référence à l'image bitmap que vous y placez. À moins que vous ne vous débarrassiez de la zone d'image, elle contient une référence à chaque bitmap que vous chargez.