Entwickler-Ecke

C# - Die Sprache - Wie kann ich den Speicher freigeben (von Objekten)


friesi - Mo 27.11.06 22:50
Titel: Wie kann ich den Speicher freigeben (von Objekten)
Hallo!

Ich habe ein Programm geschrieben, welches Bilder verkleinern soll.
Dazu hab ich etwas im Internet gefunden:
http://www.codeproject.com/csharp/quick_snip.asp

Hier gibt es eine Methode ResizeImage.

Diese wird bei mir in einer Schleife aufgerufen.
Bei jedem Schleifenzugriff reserviert er bei dieser Stelle ca. 12 MB Arbeitsspeicher


C#-Quelltext
1:
2:
Bitmap OriginalBmp = 
           (System.Drawing.Bitmap)Image.FromFile(FileName).Clone();


Beim nächsten Aufruf holt er sich wieder 12 MB u.s.w.
Der Arbeitsspeicher füllt sich und das Programm beendet mit der Meldung, das zuwenig Arbeitsspeicher vorhanden ist.

Ich habe versucht den Speicher hiermit freizugeben:

C#-Quelltext
1:
OriginalBmp.Dispose();                    


Das bringt aber vielleicht gerade mal 1-2 MB.

Übersehe ich etwas? Glaube das es mit (System.Drawing.Bitmap) etwas zutun haben könnte.
Vielleicht kann mir einer einen Tipp/Lösung geben.

Vielen Dank :)


Robert_G - Mo 27.11.06 23:19

Warum fertigst du auch einen Clon an? :)
Das ursprüngliche Image hast du ja nicht freigegeben. ;)


friesi - Mo 27.11.06 23:22

mhm?
Sorry steh gerade einwenig auf dem schlauch :)
Wie könnte ich das denn ambesten machen?


Robert_G - Mo 27.11.06 23:29

user profile iconfriesi hat folgendes geschrieben:
mhm?
Sorry steh gerade einwenig auf dem schlauch :)
Wie könnte ich das denn ambesten machen?
Probier' mal so:

C#-Quelltext
1:
2:
3:
4:
5:
using(Image loadedBmp = Image.FromFile(FileName))
using(Bitmap OriginalBmp = loadedBmp.Clone() as Bitmap)
{
...
}
Also ohne direkt Clone aufzurufen. Using wird am Ende des Blockes autom. Dispose ausführen.
Ist schnieker so. :)
Dein Problem war, dass du das geladene Bild nicht freigeben kontest, da du keine Referenz darauf gehalten hast. Du hast ja sofort Clone darauf ausgeführt und mit der Kopie weitergearbeitet.
setze mal einen Breakpoint und schaue im Debugger, ob loadedBmp nicht bereits eine Instanz von Bitmap ist. Dann ersparst du dir die Kopie.