Frage

habe ich ein Problem mit aus dem Speicher, wenn ich Last bin versucht, ein paar Bilder zu einem 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`
War es hilfreich?

Lösung

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

Bad. Sie laden das Bild aus der Datei überprüft, um zu sehen, ob das Ergebnis null ist ... dann ist es wieder in ein neues Ergebnis geladen, damit Sie sie entsorgen können. Während letztere Teil albern ist, ist es nicht schädlich. Der erste Teil ist jedoch, wie die resultierende Image wird nie richtig entsorgt (wenn / wenn der GC sammelt, der Finalizerthread auf dem Image Typ sollte Entsorgen Sie die nicht verwalteten Ressourcen, aber dies ist kein kluge Sache vertrauen).

Im übrigen Image.FromFile nie null zurück. Wenn es nicht das Bild lesen kann, dann wird es eine OutOfMemoryException werfen.

Der Code erscheint auch nichts zu tun, da es kein else Block und nichts sinnvoll ist, in dem if Block durchgeführt.

Meine Vermutung ist, dass Ihr OutOfMemoryException aus der Tatsache kommt, dass eine oder mehrere der Dateien in diesem Verzeichnis in einem beschädigten oder nicht unterstützten Bildformat gespeichert ist, , oder ist kein Bild überhaupt.

Versuchen Sie den Code in Ihrem foreach mit diesem zu ersetzen:

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

Andere Tipps

Das Bildfeld hält intern einen Verweis auf die Bitmap, dass Sie in sie setzen. Es sei denn, Sie von dem Bilderfeld loszuwerden, ist es eine Referenz auf jede Bitmap hält man in sie laden.

Etwas, das Sie, dass unabhängig von der Art des Bildes auf der Festplatte gespeichert hat zu prüfen, wenn Sie es für die Anzeige öffnen das Bild ein Bitmap und erfordert 4 Byte pro Pixel angezeigt.

Der Code scheint ein Versuch zu einer Thumbnail-Operation vorzuschlagen. Sie sind in der Tat Laden 70 Dateien in dem Speicher und unabhängig von der Displaygröße, im Speicher werden sie sehr groß sein.

Zum Beispiel: Angenommen, Sie 70 JPEG-Dateien in 32-Bit-Farbtiefe haben und sagen 1920x1080 Pixel groß. Ihr Speicherbedarf zu laden, die viele Bilder auf einmal ist dann:

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

Und das ist eine ziemlich niedrige Schätzung.

Sie könnten betrachten viele weniger Bilder oder versuchen, für eine echte thumbnailing Lösung geladen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top