Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.
Seite 1 von 2  1 2      

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