Jpeg laden, aber es dauert so lange?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
pLaz
Beiträge: 8
Registriert: Di 18. Sep 2007, 22:16

Jpeg laden, aber es dauert so lange?

Beitrag von pLaz »

Hi,

ich würde gerne auf dem schnellsten weg 136 jpeg (sind ca 26 Mb) in den Speicher laden. am besten beim Starten des Programms. Im moment mach ich folgendes:

Code: Alles auswählen

for i := 0 to 6 do  begin
      Images[i][0] := TJPEGImage.Create;
      Images[i][1] := TJPEGImage.Create;
      Images[i][2] := TJPEGImage.Create;
      Images[i][3] := TJPEGImage.Create;
      Images[i][4] := TJPEGImage.Create;
      Images[i][5] := TJPEGImage.Create;
      Images[i][6] := TJPEGImage.Create;
      Images[i][7] := TJPEGImage.Create;
      Images[i][8] := TJPEGImage.Create;
   end;
for i := 0 to 6 do  begin
       Images[i][0].LoadFromFile(path+'Grafik\Fragebogen\fragebogen'+pfad[i]+'\fragebogen_s1.jpg');
 
       Images[i][1].LoadFromFile(path+'Grafik\Fragebogen\fragebogen'+pfad[i]+'\fragebogen_s2.jpg');
 
       Images[i][2].LoadFromFile(path+'Grafik\Fragebogen\fragebogen'+pfad[i]+'\fragebogen_s3.jpg');
 
       Images[i][3].LoadFromFile(path+'Grafik\Fragebogen\fragebogen'+pfad[i]+'\fragebogen_s4.jpg');
 
       Images[i][4].LoadFromFile(path+'Grafik\Fragebogen\fragebogen'+pfad[i]+'\fragebogen_s5.jpg');
 
       Images[i][5].LoadFromFile(path+'Grafik\Fragebogen\fragebogen'+pfad[i]+'\fragebogen_s6.jpg');
 
       Images[i][6].LoadFromFile(path+'Grafik\Fragebogen\fragebogen'+pfad[i]+'\fragebogen_s7.jpg');
 
       Images[i][7].LoadFromFile(path+'Grafik\Fragebogen\fragebogen'+pfad[i]+'\fragebogen_s8.jpg');
 
       Images[i][8].LoadFromFile(path+'Grafik\Fragebogen\fragebogen'+pfad[i]+'\fragebogen_s9.jpg');
    end;
Dies wird in der procedure onFormCreate gemacht. Nur es dauert seeeehr lange. (ca 15 sec.) :(
Die vorgehensweise ist wie folgt:

Code: Alles auswählen

var jpg: TJPegImage;
jpg:=TJPegImage.create;
jpg.LoadFromFile(filename);
Hat jemand eine Idee wie man das beschleunigen kann??

2. Frage: Die Bilder werden zur zeit im Constructor der Frames geladen. ist es sinnvoll das auszulagern?

Danke
patrick

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

Beitrag von theo »

Musst du denn alle gleichzeitig laden?
Das geht auch ganz schön in den Speicher.

Die Antwort hängt sehr davon ab, wie/wann du die Bilder anzeigst.
Je nachdem könntest du die benötigten in einem Thread vor-laden.
z.B. à la Slideshow einfach immer das Nächste.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Viel schneller wird es wohl nicht gehen, außer du nimmst ein anders Format kannst die Bilder ja unkomprimiert nehmen sind dann wahrscheinlich so an die 200 mb ist auch fraglich ob es so viel schneller geht die von der platte zu lesen als die jpgs zu dekomprimieren. und wunder dich nicht wenn dein Programm auf Rechnern mit weniger als 312 mb ram nicht läuft...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pLaz
Beiträge: 8
Registriert: Di 18. Sep 2007, 22:16

Beitrag von pLaz »

Das Programm soll von CD laufen, nicht von der Platte. Ich bin der Meinung, dass wenn ich jedes bild einzeln lade es evtl in der Summe noch länger dauert, da jedesmal das CD laufwerk wieder anstarten muß. Es sind halt von jedem Screen die hintergrund bilder, man drückt auf weiter, dann kommt sdas nächste bild, man kann auch zurück gehen, es perden popups angezeigt mit bis zu 9 Bildern ....

Ich bin der Meinung, daß das öffnen und schließen der Dateien so lange dauert. Kannn man die bilder nicht in eine Datei speichern und nur diese laden?

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

Beitrag von theo »

pLaz hat geschrieben: Ich bin der Meinung, daß das öffnen und schließen der Dateien so lange dauert. Kannn man die bilder nicht in eine Datei speichern und nur diese laden?
Glaub ich nicht. Die Bilder müssen ja dekodiert werden. Das dauert schon seine Zeit.
Kannst ja mal kucken, ob's von HD schneller lädt.

pLaz
Beiträge: 8
Registriert: Di 18. Sep 2007, 22:16

Beitrag von pLaz »

Momentan werden die Bilder von der Platte geladen, dauert halt 15sec. Von der CD dauert es genau so lange (+3sec). Werden die bilder nicht erst beim anzeigen decodiert? Der speicherbedarf steigt ja nicht in die höhe nach dem laden... Wenn man ein bild bespielsweise in Photoshop öffnet, welches 100MB groß ist, dauert es "nur" 3 sec.
Ich bin mir da nicht so sicher, weil beim kopieren von dateien es auch länger dauert, wenn man 100 X 1Mb große files Kopiert oder 1 X ein 100 mb file.

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

Beitrag von theo »

pLaz hat geschrieben:Momentan werden die Bilder von der Platte geladen, dauert halt 15sec. Von der CD dauert es genau so lange (+3sec). Werden die bilder nicht erst beim anzeigen decodiert?
Da bin ich mir nicht sicher. Dann müsste die Dekodierarbeit ja bei jedem "Anzeigen" gemacht werden.
Das kannste ja mal testen. Ersetze in deinem Code einfach mal TJPEGImage mit TMemoryStream. Dann wird sicher nichts dekodiert.
Wenn das genau gleich lang dauert, hast du recht.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

was hältst du von der Idee, einfach immer nur zwei Bilder zu laden:
Das Nächste und das Übernächste Bild.

Dann würde es nicht ewig dauern bis das Bild geladen wird.

Ich gebe dir aber recht, ich glaube auch das ständige Starten würde auch einige Zeit kosten.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Das nächste bild im Hintergrund zu laden sollte reichen und jewails das aktuelle, letzte und nächste bild im speicher zu halten
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pLaz
Beiträge: 8
Registriert: Di 18. Sep 2007, 22:16

Beitrag von pLaz »

Leider kann man das so nicht machen, da man teilweise sehr schnell die einzelnen Seiten durchklicken kann. Das würde die gesammte bilderstrecke Ruckelig und Unprofessionell aussehen lassen. Aber evtl kann man bei jedem Popup, bzw bei jeder anfangenden Bilder-Strecke einfach vorher die Bilder laden. Ich sehe das Problem bei der Bereitstellung der Daten, da die Bilder von Cd geladen werden.
Also: Anstoßen der cd-rom, dann daten auf cd-rom suchen, laden ...

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Irgendwie erzählst du Quatsch. Wenn du für 136 Bilder zum laden 15 Sekunden brauchst sind das pro Bild ca 100ms so schnell klickt kein mensch. Die Verzögerung ist nichtmal spürbar. Wenn du angst hast mit der CD dann kopierst du halt die Bilderstrecke in einen Temporären Ordner auf der Platte 26 mb sollten auch recht flott kopiert sein solangs am stück geschieht...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Naja das währe aber auch blöd.

Die Bilder liegen alle in einem Verzeichniss oder ?
Wie währe es wenn du sie in Gruppen zusammen fassen würde und immer nur eine kleine anzahl laden würdes ?

Z.b. könnten die Bilder dann einer TreeView geladen werden und beim öffnen eines zweigen wird nach geladen.
MFG
Michael Springwald

Antworten