Out-of-memory-Ausnahme beim laden von Bildern
Ich bin mit dem folgenden Stück code für das laden von Bildern als Miniaturansichten auf einem FlowLayoutPanel-Steuerelement. Leider bekomme ich eine OutOfMemory-exception.
Als Sie schon erraten, der Speicher Leck ist gefunden in Zeile
Pedit.Image = System.Drawing.Image.FromStream(fs)
Also wie könnte ich es optimieren Sie den folgenden code?
Private Sub LoadImagesCommon(ByVal FlowPanel As FlowLayoutPanel, ByVal fi As FileInfo)
Pedit = New DevExpress.XtraEditors.PictureEdit
Pedit.Width = txtIconsWidth.EditValue
Pedit.Height = Pedit.Width / (4 / 3)
Dim fs As System.IO.FileStream
fs = New System.IO.FileStream(fi.FullName, IO.FileMode.Open, IO.FileAccess.Read)
Pedit.Image = System.Drawing.Image.FromStream(fs)
fs.Close()
fs.Dispose()
Pedit.Properties.SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom
If FlowPanel Is flowR Then
AddHandler Pedit.MouseClick, AddressOf Pedit_MouseClick
AddHandler Pedit.MouseEnter, AddressOf Pedit_MouseEnter
AddHandler Pedit.MouseLeave, AddressOf Pedit_MouseLeave
End If
FlowPanel.Controls.Add(Pedit)
End Sub
Update: Das problem tritt auf, wenn beim laden eine Reihe von Bildern (3264x2448px bei 300 dpi - jedes Bild ist über 3Mb)
Haben Sie versucht, die Isolierung des Problems durch die Beseitigung aller überflüssigen code und versucht nur das image laden? Sie haben versucht, die Zuordnung der geladenen Bild (wenn es soweit kommt) in einem 'normalen' Bild-display-Steuerung?
Tun Sie run out of memory beim laden nur ein Bild, oder nach vielen Bildern? Es ist nur ein bestimmtes Bild, das gibt Ihnen Probleme, oder scheitert es, wenn Sie versuchen, laden Sie eine beliebige Bild? Sind die Bilder außergewöhnlich groß ist? Bitte, mehr Details und das beste, das wir tun können, ist zu erraten.
Hallo, könnten Sie bitte das update?
geschieht dies für jede Gruppe von Bildern oder ist es 1 bestimmtes Bild, das ist die Ursache HIERFÜR? Leider ist der OOM-Ausnahme eher eine Allgemeine Fehlermeldung, die geworfen erhält oft beim Umgang mit Bildern. (Ok, ist kein allgemeiner Fehler, sondern ein low-level-Fehler, die nicht bekommen, verpackt in einem mehr spezifischen Fehler.) Ich habe über diesen Fehler, bevor Sie mit korrupten Bildern. Manchmal sind seine Bilder werden unkomprimiert in den Speicher, da viel größere Bilder. stackoverflow.com/questions/1108607/...
Ein Bild von 3264x2448 ist 7,990,272 Pixel. Wenn Sie 24-bit-Farbe, die 3 byte pro pixel oder etwa 23 Megabyte pro Bild. Sie könnten nur 3 MB, komprimiert auf der Festplatte, sondern im Arbeitsspeicher, es wird die volle unkomprimierte Größe. Sie können nicht laden, viele von denen, wenn Sie ein system mit wenig Speicher.
Tun Sie run out of memory beim laden nur ein Bild, oder nach vielen Bildern? Es ist nur ein bestimmtes Bild, das gibt Ihnen Probleme, oder scheitert es, wenn Sie versuchen, laden Sie eine beliebige Bild? Sind die Bilder außergewöhnlich groß ist? Bitte, mehr Details und das beste, das wir tun können, ist zu erraten.
Hallo, könnten Sie bitte das update?
geschieht dies für jede Gruppe von Bildern oder ist es 1 bestimmtes Bild, das ist die Ursache HIERFÜR? Leider ist der OOM-Ausnahme eher eine Allgemeine Fehlermeldung, die geworfen erhält oft beim Umgang mit Bildern. (Ok, ist kein allgemeiner Fehler, sondern ein low-level-Fehler, die nicht bekommen, verpackt in einem mehr spezifischen Fehler.) Ich habe über diesen Fehler, bevor Sie mit korrupten Bildern. Manchmal sind seine Bilder werden unkomprimiert in den Speicher, da viel größere Bilder. stackoverflow.com/questions/1108607/...
Ein Bild von 3264x2448 ist 7,990,272 Pixel. Wenn Sie 24-bit-Farbe, die 3 byte pro pixel oder etwa 23 Megabyte pro Bild. Sie könnten nur 3 MB, komprimiert auf der Festplatte, sondern im Arbeitsspeicher, es wird die volle unkomprimierte Größe. Sie können nicht laden, viele von denen, wenn Sie ein system mit wenig Speicher.
InformationsquelleAutor OrElse | 2011-01-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lösen können Sie dieses in wenigen Schritten:
Ich kann mir vorstellen ACDsee und die wie miniaturen erstellen und verwenden von load-on-demand für den rest.
InformationsquelleAutor Henk Holterman
Dokumentation für
Image.FromFile
(das ist im Zusammenhang zu IhremFromStream
) sagt, dass es werfenOutOfMemoryException
wenn die Datei ist keine gültige image-format oder, wenn GDI+ nicht unterstützt pixel-format. Ist es möglich Sie zu laden versucht eine nicht unterstützte Bild-Typ?Auch die Dokumentation für
Image.FromStream
sagt, dass Sie haben, um den stream zu öffnen für die Lebensdauer des Bildes, so dass, selbst wenn Ihr code geladen, das Bild würde Sie wahrscheinlich eine Fehlermeldung erhalten, weil Sie beim schließen der Datei, während das Bild ist immer noch aktiv. Sehen http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx.InformationsquelleAutor Jim Mischel
Paar Gedanken:
First off, wie Jim gesagt hat, wenn mit
Image.FromStream
der stream sollte offen bleiben für die Lebensdauer des Bildes wie auf der MSDN-Seite. Als solche, würde ich vorschlagen, kopieren Sie den Inhalt der Datei in einen MemoryStream, und das letztere um das Bild zu erstellen-Instanz. So lassen Sie die Datei-handle so schnell wie möglich.Zweitens, die Bilder, die Sie verwenden, sind ziemlich groß (unkomprimiert, als würden Sie im Speicher vorhanden sind, Breite x Höhe x BytesPerPixel). Vorausgesetzt, der Kontext, die Sie verwenden, in der es erlauben würde, für Sie werden kleiner, betrachten Größenänderung, und Zwischenspeicherung potenziell verkleinerte Versionen irgendwo zur späteren Verwendung.
Schließlich, vergessen Sie nicht zu Entsorgen, das Bild und der Stream, wenn Sie nicht mehr benötigt werden.
InformationsquelleAutor Yannick Motton
Ich hatte das gleiche problem. Jim Mischel mit ein Antwort führte mich zu entdecken, laden einen unschuldigen .txt-Datei der übeltäter war. Hier ist meine Methode, falls es jemanden interessiert.
Hier ist meine Methode:
InformationsquelleAutor blak3r