Nicht genügend Arbeitsspeicher mit mehreren Bildern in einer picturebox
-
20-09-2019 - |
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`
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.