Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bilder schneller laden (https://www.delphipraxis.net/124116-bilder-schneller-laden.html)

Neutral General 14. Nov 2008 18:32


Bilder schneller laden
 
Hi,

Wollte einen kleinen ImageViewer bauen. Nichts großes und auch nur zum privaten Gebrauch. Habe mir die Vampyre Imaging Lib runtergeladen. Funktioniert auch soweit super. Mein Problem ist allerdings, dass mir das Laden der Bilder z.T. zu lange dauert. Ein 1,5 MB jpeg dauert mit Vampyre ca. 460-500ms. Mit der jpeg.dcu dauerts 700+ms.

Was ich mir mal überlegt hatte, ist das vorherige und nächste Bild schon im Hintergrund zu laden, während man ein Bild anschaut. Das Problem ist aber, dass das nur bedingt helfen würde denn ein Problem wäre z.B. wenn ein mein Viewer mit einem großen Bild gestartet wird. Ich kann ja nicht vorladen, bevor mein Programm überhaupt gestartet ist....

Die Frage ist halt, wie ich das am geschicktesten anstelle, bzw obs eine Wundergraphikbibliothek gibt :mrgreen:
Ansonsten gibts ja noch den Trick, die gefühlte Ladezeit künstlich zu verkürzen. Aber ich denke, damit kann man auch keine 500ms rausholen.

Gruß
Neutral General

mkinzler 14. Nov 2008 18:34

Re: Bilder schneller laden
 
5 Sekunden Splashscreen und Animationen beim Bildwechsel und der Anwender merkt nichts vom Bilderladen :mrgreen:

Neutral General 14. Nov 2008 18:37

Re: Bilder schneller laden
 
Zitat:

Zitat von mkinzler
5 Sekunden Splashscreen und Animationen beim Bildwechsel und der Anwender merkt nichts vom Bilderladen :mrgreen:

Ich musste grinsen :mrgreen:
Da ist was dran^^ Allerdings will ich zumindest relativ schnell durchblättern können, bzw die Animationen ausschalten können und dann muss es auch noch akzeptabel schnell gehn ;)

Das mit dem Splashscreen könnte man sich ja sogar mal überlegen, wenn auch 5 Sekunden etwas übertrieben wären für nen PictureViewer :lol: (ok für ein PictureViewer ist es theoretisch generell unnötig, aber egal :stupid: )

Luckie 14. Nov 2008 18:42

Re: Bilder schneller laden
 
Ich denke für das erste Bild musst du die Ladezeit in kaufnehmen. Die folgenden Bilder kannst du dann ja in MemoryStrams laden, während das erste noch angezeigt wird*. Ein anderer Faktor dürfte die Darstellung auf der Komponente sein. Was passiert denn, wenn du während des Laden die Eigenschaft Visisble der Komponente auf False setzt oder wenn du das Bild erst in ein Bitmap im Speicher lädst und dann auf den Canvas der Komponete blittest?


') Da musst du aber mal testen, ob MemorySreams und Lo0adfromStream was bringen.

Neutral General 14. Nov 2008 18:52

Re: Bilder schneller laden
 
Zitat:

Zitat von Luckie
Ich denke für das erste Bild musst du die Ladezeit in kaufnehmen. Die folgenden Bilder kannst du dann ja in MemoryStrams laden, während das erste noch angezeigt wird*. Ein anderer Faktor dürfte die Darstellung auf der Komponente sein. Was passiert denn, wenn du während des Laden die Eigenschaft Visisble der Komponente auf False setzt oder wenn du das Bild erst in ein Bitmap im Speicher lädst und dann auf den Canvas der Komponete blittest?


') Da musst du aber mal testen, ob MemorySreams und Lo0adfromStream was bringen.

Also ich habe mir extra ein eigenes TImageEx = class(TCustomControl) gebaut. In erster Linie um Bilder propertional gestretcht anzeigen lassen zu können. Ich mache es im Moment so:

Delphi-Quellcode:
TImageEx = class(TCustomControl)
private
  FBitmap: TBitmap;
  FPicture: TPicture;
  // etc
published
  property Picture: TPicture read FPicture write SetPicture;
  // etc
end;
Und TPicture hat ein OnChange Event, indem ich folgendes tue:

Delphi-Quellcode:
procedure TImageEx.PicChanged(Sender: TObject);
begin
  with FBitmap do
  begin
    Width := FPicture.Graphic.Width;
    Height := FPicture.Graphic.Height;
    Canvas.Draw(0,0,FPicture.Graphic);
  end;
  Repaint;
end;
Im OnPaint meiner Komponente blitte ich dann mein Bitmap (gestretcht oder/und zentriert, oder....) auf den DC meiner Komponente.

Das mit dem Visible auf false setzen hab ich nicht so ganz verstanden, bzw was wäre der Nutzen?

mkinzler 14. Nov 2008 18:55

Re: Bilder schneller laden
 
Zitat:

Das mit dem Visible auf false setzen hab ich nicht so ganz verstanden, bzw was wäre der Nutzen?
Das mit dem Zeichnen, gewartet ist, bis das ganze Bild geladen wurde

Neutral General 14. Nov 2008 19:04

Re: Bilder schneller laden
 
Ja wird doch sowieso oder nicht? :gruebel:

himitsu 14. Nov 2008 19:07

Re: Bilder schneller laden
 
z.B. einige jPegs bieten doch die Möglichkeit schon angezeigt zu werden, wenn sie noch nicht ganz geladen sind ... könnte man dieses nicht irgendwie ausnutzen und es somit schon früher (nur etwas unschärfer) anzuzeigen?



Aber bezüglich des Schnell Durchblätterns...
wie wäre es wenn wenn du nicht nur das nächste und vorherrige bild vorlädst, sondern dir sowas wie diese Thumbs.db anlegst (kannst'e ja nach dem Programmende wieder löschen)

In einem Thread die Cache verwalten ... alle Bilder nacheinander abarbeiten und sofort benötigte Bilder vorrangig bearbeiten lassen.

mkinzler 14. Nov 2008 19:11

Re: Bilder schneller laden
 
Bei progressiven Jpegs würde das gut funktionieren

Pfoto 14. Nov 2008 19:37

Re: Bilder schneller laden
 
Bei der JPEG-Lib von Delphi kannst du ja auch das Bild vorerst halb, viertel- oder ein-achtel so groß laden.
Er liest das nur jede x-te Zeile.

Neutral General 15. Nov 2008 12:07

Re: Bilder schneller laden
 
Hi,

Zitat:

Zitat von himitsu
Aber bezüglich des Schnell Durchblätterns...
wie wäre es wenn wenn du nicht nur das nächste und vorherrige bild vorlädst, sondern dir sowas wie diese Thumbs.db anlegst (kannst'e ja nach dem Programmende wieder löschen)

In einem Thread die Cache verwalten ... alle Bilder nacheinander abarbeiten und sofort benötigte Bilder vorrangig bearbeiten lassen.

Die Idee finde ich eigentlich ganz gut. Aber wenn ich die Bilder inner Datei speichere, muss ich sie ja auch quasi wieder laden. Das laden ginge wahrscheinlich etwas schneller, wenn ich die Bilder alle als .bmp gespeichert hab. Aber bei 50 1,5MB großen JPEGs wird das ganze dann schon arg groß... (1,5MB jpg --> 18MB bmp :!: )

Ach ja: Fixiert euch nicht so sehr auf die jpegs. Mein Programm läd die meisten gängigsten Graphikformate. Das mit dem jpg war jetzt nur ein Beispiel, also sind jpeg-spezifische Tipps nicht so wertvoll.

Gruß
Neutral General

himitsu 15. Nov 2008 12:16

Re: Bilder schneller laden
 
Nja, zumindestens könntest du die Dateien so schonmal vorbereiten und in ein Format und eine Größe bringen, welche dir Einiges an späterer Warterei abnimmt :angel2:
(kanst da ja auch erstmal nur die Bilder in einer kleinerer/unschärferen Vorschauversion erstellen und das große/bessere Bild dann nachladen, wenn man etwas länger das jeweilige Bild betrachtet)

Fridolin Walther 15. Nov 2008 13:37

Re: Bilder schneller laden
 
Zitat:

Zitat von Neutral General
Die Idee finde ich eigentlich ganz gut. Aber wenn ich die Bilder inner Datei speichere, muss ich sie ja auch quasi wieder laden. Das laden ginge wahrscheinlich etwas schneller, wenn ich die Bilder alle als .bmp gespeichert hab. Aber bei 50 1,5MB großen JPEGs wird das ganze dann schon arg groß... (1,5MB jpg --> 18MB bmp :!: )

Nunja, allerdings lassen sich BMPs relativ gut (je nach Bild) mit recht schnellen Kompressionsverfahren "schrumpfen". Denke mal das nach einer einfachen Kompression mit ZLIB z.B. die Bilder evtl. nur noch 4 - 5 MB haben. Dabei sollte die Dekompression nur wenige Millisekunden in Anspruch nehmen auf modernen CPUs. Oder aber Du speicherst verkleinerte Versionen der Bilder ab. Denn genau genommen ist die Anzeige Geschwindigkeit ja nur im "Thumbnail" Modus wichtig. Wenn ich dann ein großes Bild wirklich lade, werden die 500 ms oder was das waren eher nicht auffallen und in nem Dia Show Modus kannst Du bereits das nächste Bild laden während das erste angezeigt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr.

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