Question

J'ai un problème de mémoire quand je suis en essayant de charger quelques images en une seule picturebox.

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`
Était-ce utile?

La solution

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

. Vous chargez l'image à partir du fichier, de vérifier si le résultat est nul ... alors le chargement à nouveau dans un nouveau résultat pour que vous puissiez le disposer. Alors que la dernière partie est stupide, cela ne nuit pas. La première partie est, cependant, que le Image résultant est disposé jamais correctement de (si / quand le GC le ramasse, le finaliseur du type de Image devrait disposer des ressources non gérées, mais ce n'est pas chose sage de compter sur).

Par ailleurs, Image.FromFile ne reviendra null. Si elle ne peut pas lire l'image, il lancera une OutOfMemoryException.

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

Je suppose que votre OutOfMemoryException vient du fait que l'un ou plusieurs des fichiers dans ce répertoire est stocké dans un format d'image corrompue 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

Autres conseils

La zone d'image contient une référence interne au bitmap que vous placez en elle. À moins que vous vous débarrasser de la zone d'image, il tient une référence à chaque bitmap que vous chargez en elle.

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écessitent 4 octets par pixel affiché.

Votre code semble suggérer une tentative d'une opération des vignettes. Vous êtes en fait le chargement de 70 fichiers en mémoire et quelle que soit la taille de l'écran, dans la mémoire, ils seront très grandes.

Par exemple, disons que vous avez 70 à jpegs profondeur de couleur de 32 bits et dire 1920x1080 pixels. Votre exigence de mémoire pour charger que de nombreuses images à la fois alors est:

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

Et c'est une estimation assez faible.

Vous pourriez envisager de charger beaucoup moins de photos ou d'essayer une vraie solution thumbnailing.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top