Gelöst: Screenshot (JPG) frisst Speicher

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Gelöst: Screenshot (JPG) frisst Speicher

Beitrag von petermännchen »

Code: Alles auswählen

procedure CreateScreenShot(AWinControl: TWinControl; AFileName: String);
var
  JPEG: TJPEGImage;
begin
  if not directoryexists(extractfiledir(AFilename)) then
    createdir(extractfiledir(AFilename));
    JPEG := TJPEGImage.Create;
    JPEG.Assign(_FSMAin.GetFormImage);
    JPEG.SaveToFile(AFileName);
    JPEG.clear;
    JPEG.Free;
end;
Hallo beisammen:
also mit clear wird ungefähr ein Drittel des Speichers wiederfreigegebn. Der Rest ist weg. :(
Passiert unter Windows. Free hat keine Auswirkungen auf den Speicher! :roll:

Was mache ich da falsch?

VIelen Dank

Peter
Zuletzt geändert von petermännchen am Fr 14. Jan 2011, 15:25, insgesamt 1-mal geändert.
Zeiterfassung, einfach gerechter!

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Screenshot (JPG) frisst Speicher

Beitrag von theo »

Wenn du dir die Mühe machen würdest zu schauen was in der Funktion GetFormImage passiert, kämst du selber drauf. ;-)

petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Re: Screenshot (JPG) frisst Speicher

Beitrag von petermännchen »

theo hat geschrieben:Wenn du dir die Mühe machen würdest zu schauen was in der Funktion GetFormImage passiert, kämst du selber drauf. ;-)
OK, kannst du mir helfen, wo ich diese Info finde?

Mir war immer so, dass wenn ich eine Komponente frei gebe, dann auch alle gebundenen Resourcen. Muss also noch etwas anderes passieren oder?

Danke dir

Gruß

Peter
Zeiterfassung, einfach gerechter!

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Screenshot (JPG) frisst Speicher

Beitrag von theo »

petermännchen hat geschrieben: OK, kannst du mir helfen, wo ich diese Info finde?
Du weisst das wirklich nicht oder?
Dann lernst du jetzt gleich was für's Leben ;-)

Setze den Eingabecursor auf das Wort "GetFormImage".
Dann rufe das Kontextmenu (Rechtsklick) auf und wähle "Deklaration suchen".
Dann hüpft er auf die Deklaration. Von dort aus drücke Shift+Ctrl+Down und so kommst du auf die Implementation.
Mit Shift+Ctrl+Up wieder auf die Deklaration.

Erleuchtend, nicht wahr? ;-)

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Screenshot (JPG) frisst Speicher

Beitrag von carli »

theo hat geschrieben:Von dort aus drücke Shift+Ctrl+Down und so kommst du auf die Implementation.
Mit Shift+Ctrl+Up wieder auf die Deklaration.
Hey cool! so was hab ich schon immer mal gebraucht.

petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Re: Screenshot (JPG) frisst Speicher

Beitrag von petermännchen »

Ich komm nicht drauf :(

Ich seh was passiert. Aber wie bekomme ich nun den Speicher wieder frei?

Wenn ich's recht verstehe:
Ich bekomme eine Kopie vom Bitmap (aktueller Screen). Die Kopie wird von mir wieder freigegeben. Das Original bleibt?

Vielen Dank übrigens für den Tip :D

Gruß

Peter
Zeiterfassung, einfach gerechter!

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Screenshot (JPG) frisst Speicher

Beitrag von theo »

petermännchen hat geschrieben: Ich bekomme eine Kopie vom Bitmap (aktueller Screen). Die Kopie wird von mir wieder freigegeben. Das Original bleibt?

Afaics wird In der Funktion ein Bitmap erstellt, welches von dir freigegeben werden müsste.
Also:

var Bmp:TBitmap;
...
Bmp:=_FSMAin.GetFormImage;
JPEG.Assign(Bmp);
Bmp.free;
Zuletzt geändert von theo am Fr 14. Jan 2011, 12:19, insgesamt 1-mal geändert.

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Screenshot (JPG) frisst Speicher

Beitrag von am2 »

petermännchen hat geschrieben:Ich komm nicht drauf :(

Ich seh was passiert. Aber wie bekomme ich nun den Speicher wieder frei?

Wenn ich's recht verstehe:
Ich bekomme eine Kopie vom Bitmap (aktueller Screen). Die Kopie wird von mir wieder freigegeben. Das Original bleibt?

Vielen Dank übrigens für den Tip :D

Gruß

Peter
Nein, ohne, dass ich das nachvollzogen habe: Du fertigst eine Kopie von etwas an, das eigens für Dich erzeugt und Dir übergeben wurde.

Also bildlich: Du sagst jemandem, er soll für Dich ein Dokument anfertigen.
Dieser tut das und gibt es Dir und geht weg.
Du kopierst es und läßt dann das extra für Dich erstellte Dokument zu Boden fallen.

Wenn ich die Postings richtig verstanden habe, müßtest Du das Create und das Assign weglassen und stattdessen irgend etwas schreiben, wie
MyJPeg:=_FSMAin.GetFormImage;
und bei MyJPeg.Free wird dann, wie erwartet, das eigens für Dich angelegte vernichtet.

Aber das ist wirklich nur aus den Postings abgeleitet, die ich vielleicht völlig falsch verstanden habe.
Zuletzt geändert von am2 am Fr 14. Jan 2011, 12:30, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Screenshot (JPG) frisst Speicher

Beitrag von theo »

am2 hat geschrieben: MyJPeg:=_FSMAin.GetFormImage;
Fast, nur dass die Fkt. halt kein TJPEGImage sonder ein TBitmap created.
So wie ich oben geschreiben habe müsste es klappen.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Screenshot (JPG) frisst Speicher

Beitrag von Socke »

theo hat geschrieben:Fast, nur dass die Fkt. halt kein TJPEGImage sonder ein TBitmap created.
So wie ich oben geschreiben habe müsste es klappen.
Dann könnte man jetzt nur noch darüber streiten, ob JPEG eine geeignete Komprimierung für Zeichnungen wie Bildschirmfenster darstellt. PNG bietet ebenfalls eine gute Komprimierung ohne jegliche Artefakte.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Screenshot (JPG) frisst Speicher

Beitrag von carli »

Socke hat geschrieben:
theo hat geschrieben:Fast, nur dass die Fkt. halt kein TJPEGImage sonder ein TBitmap created.
So wie ich oben geschreiben habe müsste es klappen.
Dann könnte man jetzt nur noch darüber streiten, ob JPEG eine geeignete Komprimierung für Zeichnungen wie Bildschirmfenster darstellt. PNG bietet ebenfalls eine gute Komprimierung ohne jegliche Artefakte.
Im RAM werden übrigens weder JPEG noch PNG verwendet, sondern die Pixel entpackt, damit man damit arbeiten kann. Das Grafikformat ist nur von Relevanz, falls man das Bild abspeichert.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Screenshot (JPG) frisst Speicher

Beitrag von Socke »

carli hat geschrieben:Im RAM werden übrigens weder JPEG noch PNG verwendet, sondern die Pixel entpackt, damit man damit arbeiten kann. Das Grafikformat ist nur von Relevanz, falls man das Bild abspeichert.
Ja schon, aber im ersten Post habe ich auch ein SaveToFile() entdeckt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Re: Screenshot (JPG) frisst Speicher

Beitrag von petermännchen »

Hallop Theo,

du hast recht. Deine Lösung funktioniert :P
Vielen Dank dafür!

Im Nachhinein betrachtet war es logisch. Ich kam trotzdem nicht drauf.

Gruß
Peter
Zeiterfassung, einfach gerechter!

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Gelöst: Screenshot (JPG) frisst Speicher

Beitrag von Bauer321 »

daszu möchte ich nochmal anmerken, das das ganze bei mir nicht geklappt jat zumindestens nicht bei jpg wenn ich das ganze mit png mache bekomme ich eine speicherersparnis von 200kb was dann dich schon einige prozente sind wenn man bedenkt das die datei vorher 500kb groß war
www.mcpatcher.net | www.hoeper.me

Antworten