Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TImage bearbeiten: Speicher reicht angeblich nicht aus (https://www.delphipraxis.net/113595-timage-bearbeiten-speicher-reicht-angeblich-nicht-aus.html)

blackdrake 10. Mai 2008 19:29


TImage bearbeiten: Speicher reicht angeblich nicht aus
 
Hallo.

Ich hab mal wieder ein ganz komisches Speicherproblem.

Ich möchte ein JPEG bearbeiten. Da dies aber nicht möglich ist, arbeite ich mit TImage und Canvas und anschließend wandle ich in JPEG um:

Delphi-Quellcode:
// JPEG "ADest" wird erstellt. Ist genau so groß wie "ASource". Anschließend werden 2 PNGs auf das leere Ziel-JPEG gelegt.

procedure TMainForm.body_spec(ASource, ADest: string);
var
  img: TImage;
  img2: TPNGObject;
  tempjpeg: TJPEGImage;
  nw, nh: integer;
begin
  tempjpeg := TJPEGImage.Create;
  try
    tempjpeg.LoadFromFile(ASource);

    nw := tempjpeg.Width;
    nh := tempjpeg.Height;
  finally
    tempjpeg.Free;
  end;

  up;

  img := TImage.Create(self);
  try
    img.Width := nw; // Umweg über nw und nh um Speicher nicht zu sehr durch gleichzeitiges Öffnen von "tempjpeg" und "img" zu belasten
    img.Height := nh;

    img2 := TPNGObject.Create();
    try
      img2.LoadFromFile(GetTempDir+'files\body_spec.png');
      img.Canvas.Draw(1405, 314, img2); // <-- Es sei nicht genügend Speicher vorhanden (blödsinn!)
      img.Canvas.Draw(2136, 314, img2);
    finally
      img2.Free;
    end;

    img.Picture.SaveToFile(GetTempDir+ctmpname);
  finally
    img.free;
  end;

  BmpToJpg(GetTempDir+ctmpname, ADest);
  DeleteFile(GetTempDir+ctmpname);
end;
Der Code hat aber tatsächlich mal funktioniert (und das auf einem PC mit halb so viel Speicher).

Meldung ist: "Für diesen Befehl ist nicht genügend Speicher verfügbar"

Ich habe hier aber 256 MB ph. RAM von 1 GB frei, also sehe ich kein Problem. Habe auch schon den FastMM Speichermanager am Laufen. Die Ziel-JPEG ist 4090x2678 groß. Was kann ich hier machen? PhotoShop kann doch mit so Dimensionen auch umgehen :?

Gruß
blackdrake

blackdrake 11. Mai 2008 10:34

Re: TImage bearbeiten: Speicher reicht angeblich nicht aus
 
Hallo.

Heute geht das Programm wieder. Scheinbar hat ein Neustart die Ressourcen etwas regeneriert. Das Problem sehe ich aber trotzdem noch (vor allem, weil mein Programm bei möglichst allen Endnutzern laufen soll): Wieso nutzt mein Programm/Delphi nicht die Möglichkeit der Auslagerungsdatei? Ich habe im Task-Manager gesehen, dass mein Programm eine Speicherauslastung von 85 MB hat, wenn es mit den großen Bitmaps arbeitet. Eigentlich war gestern soviel Speicher auf jeden Fall noch frei. Aber selbst wenn kein Speicher zur Verfügung stehen würde, wieso wird die Auslagerungsdatei nicht beansprucht?

Gruß
blackdrake

// Edit: Der Fehler kommt schon wieder, obwohl kaum Programme laufen und ich viel Speicher übrig habe. Ich habe gemerkt, dass kurz vor der Exception die Auslagerungsdatei von 774 MB auf 860 MB hoch geht... Trotzdem könnte die Auslagerungsdatei noch sehr viel aushalten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz