Autor Beitrag
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Di 06.01.09 20:55 
Hallo,

ich habe folgende Funktion geschrieben, um den Inhalt einer Bitmap32 im PNG(mono)-Format zu speichern (mit D2007):

ausblenden volle Höhe Delphi-Quelltext
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); //Convert data into png
    //
    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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
...
For i:=0 to someValue do
 begin
  b32_buffer.LoadFromFile(someFile);
  // Hier findet Verarbeitung der Datei statt...
  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):

ausblenden 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)