Hallo,
ich habe folgende Funktion geschrieben, um den Inhalt einer Bitmap32 im PNG(mono)-Format zu speichern (mit D2007):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| procedure SaveBitmap32ToPNG(fname: string; bm32: TBitmap32; paletted, transparent: Boolean; bgcolor: TColor; compression:Integer = 9); var bm: TBitmap; png: TPngObject; TRNS: TCHUNKtRNS; p: pngimage.PByteArray; begin bm := nil; png := nil; try bm := TBitmap.Create; png := TPngObject.Create; bm.Assign(bm32); bm.PixelFormat := pf1bit; png.InterlaceMethod := imNone; png.CompressionLevel := compression; png.Assign(bm); if transparent then begin if png.Header.ColorType in [COLOR_PALETTE] then begin if (png.Chunks.ItemFromClass(TChunktRNS) = nil)then png.CreateAlpha(); TRNS := png.Chunks.ItemFromClass(TChunktRNS) as TChunktRNS; if Assigned(TRNS) then TRNS.TransparentColor := bgcolor; end; end; png.SaveToFile(fname); finally if Assigned(bm) then bm.Free; if Assigned(png) then png.Free; end end; |
Diese Funktion rufe ich in einer Prozedur, die in etwa wir folgt ausschaut, auf:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| ... For i:=0 to someValue do begin b32_buffer.LoadFromFile(someFile); Do some work on b32_buffer... SaveBitmap32ToPNG(someFile, b32_buffer, false, true, 16777215); end; ... |
Manchmal kommt die Fehlermeldung "EOutOfResources: Für diesen Befehl ist nicht genügen freier Speicher verfügbar." Der Fehler kommt nicht immer nach dem selben Bild, sondern mal nach dem 4ten, 20ten, manchml erst nach dem 300ten oder auch garnicht. Nebenbei bemerkt, nutze ich "pngimage", was nun wohl in D2009 integriert ist.
Der Fehler liegt in folgender Zeile (wie bereits oben markiert):
Delphi-Quelltext
1:
| bm.PixelFormat := pf1bit; |
Dabei habe ich darauf geachtet, dass alle dynamisch erzeugten Objekte nach Verwendung stets wieder freigegeben werden. Wenn ich den Arbeitsspeicherbedarf des Programmes beobachte, steigt er nicht stetig an, sondern wächst mit jedem Bild an und fällt nach Verwendung des Bildes wieder auf den alten Wert. Die Anzahl der Handles wächst auch nicht ins Unermessliche.
Habt ihr einen Tipp, was schief gehen könnte? Welcher Speicher reicht nicht aus?!?!? (Oder kennt jemand sonst eine Methode, um sehr schnell Bitmap32 als PNG zu speichern?)
Gruß und Dank für eure Hilfe!!
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)