Autor Beitrag
friesi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP SP2
VS 2005
BeitragVerfasst: Mo 27.11.06 22:50 
Hallo!

Ich habe ein Programm geschrieben, welches Bilder verkleinern soll.
Dazu hab ich etwas im Internet gefunden:
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

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: Mo 27.11.06 23:19 
Warum fertigst du auch einen Clon an? :)
Das ursprüngliche Image hast du ja nicht freigegeben. ;)
friesi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP SP2
VS 2005
BeitragVerfasst: Mo 27.11.06 23:22 
mhm?
Sorry steh gerade einwenig auf dem schlauch :)
Wie könnte ich das denn ambesten machen?
Robert_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: 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:
ausblenden 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.