Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Vorschaubilder ähnlich schnell wie Win-XP erstellen (https://www.delphipraxis.net/47561-vorschaubilder-aehnlich-schnell-wie-win-xp-erstellen.html)

axelf98 13. Jun 2005 02:57


Vorschaubilder ähnlich schnell wie Win-XP erstellen
 
Hallo!

Ich programmiere grad ein Fotopräsentationsprogramm, das kleine Vorschaubilder zeigen soll. Ich habe es schon geschafft, eine recht flotte Vorschau zu realisieren, aber es ist noch lang nicht auf XP-Niveau. Mein Code:

Delphi-Quellcode:
function TFotoShow.VorschauladenEinzeln(sFoto:TFoto):boolean; //TFoto ist ein Record mit einem TBitmap
var LadImage: Timage;
    Verh: Double;

    hoehe, weite,x: integer;
begin
result := true;
 try
  LadImage := TImage.Create(nil);
  LadImage.Picture.LoadFromFile(sFoto.FileScr);
  if (LadImage.Picture.Width > 0) AND (LadImage.Picture.Height > 0)then
  begin
   Verh := LadImage.Picture.Width/LadImage.Picture.Height;
   sFoto.Vorschau.Width := VorschauGr;
   sFoto.Vorschau.Height:= VorschauGr;
   if Verh >= 1 then
   begin
    hoehe := Round(VorschauGr/Verh);
    x := round((VorschauGr-hoehe)/2);
    sFoto.Vorschau.Canvas.StretchDraw(Rect(0,x,VorschauGr,hoehe+x),LadImage.Picture.Graphic); // das ist das langsamste
   end ELSE
   begin
    weite := Round(VorschauGr*Verh);
    x := round((VorschauGr-weite)/2);
    sFoto.Vorschau.Canvas.StretchDraw(Rect(x,0,weite+x,VorschauGr),LadImage.Picture.Graphic); // das ist das langsamste
   end;
  end ELSE
  begin
  result := false;
  Fehlerprotokoll.Add('Fehler bei den Bildgrößen bei "'+sFoto.FileScr+'"');
  end;
  LadImage.Free;
 except
  Fehlerprotokoll.Add('Kann keine Vorschau erzeugen von "'+sFoto.FileScr+'"');
  result := false;
  if LadImage <> nil then LadImage.Free;
  end;
end;
Hat von euch einer eine Idee, wie man die Bildverkleinerung optimieren kann?

Grüße :coder:

alcaeus 13. Jun 2005 03:04

Re: Vorschaubilder ähnlich schnell wie Win-XP erstellen
 
Hallo axelf98,

wenn du dir die versteckten Dateien im einem der Ordner mit Bildvorschau anzeigen laesst, siehst du dass Windows diese Vorschaubilder in einer db-Datei abspeichert. Nur dadurch wird es so schnell :zwinker:

Zu deinem Code: ich empfehle dir die Verwendung von MSDN-Library durchsuchenStretchBlt, das arbeitet etwas schneller als StretchDraw ;)

Greetz
alcaeus

axelf98 13. Jun 2005 03:46

Re: Vorschaubilder ähnlich schnell wie Win-XP erstellen
 
Zitat:

Zitat von alcaeus
wenn du dir die versteckten Dateien im einem der Ordner mit Bildvorschau anzeigen laesst, siehst du dass Windows diese Vorschaubilder in einer db-Datei abspeichert. Nur dadurch wird es so schnell :zwinker:

Ich hab das Gefühl und hab es auch getestet, dass der auch ohne Thumbs.db (mal eben die Datei löschen, dann Ansicht umschalten) die Vorschaubilder ziemlich schnell macht. Deinen anderen Tipp werd ich mir noch genauer anschaun!

SirThornberry 13. Jun 2005 08:54

Re: Vorschaubilder ähnlich schnell wie Win-XP erstellen
 
das täuscht, selbst ohne thumbs.db braucht windows eine Zeit. Es kommt dir nur so schnell vor weil das ganze in einem Thread passiert und du die ersten bilder siehst bevor der Vorgang komplette abgeschlossen ist. Soll heißen - du siehst im Explorer ca. 12 Vorschaubilder und diese sind recht schnell erstellt, im Hintergrund werden dann die restlichen Bilder die im nicht sichtbaaren Bereich sind erstellt.

axelf98 13. Jun 2005 23:54

Re: Vorschaubilder ähnlich schnell wie Win-XP erstellen
 
Hi :hello:

Ich hab es nach einigem Probieren geschafft, einen Code zu "schreiben", der Thumbnails, also Vorschaubilder schnell (ähnlich wie in Windows XP) erstellt. Der braucht ungefähr 7 Sekunden für 60 6-Megapixel-Bilder für beliebig große Thumbs auf einem 1,6 Ghz Centrino. Folgend der Code:
Delphi-Quellcode:
procedure ...
    Extention: String;
    LadBitmap, Vorschau: TBitmap;
    jpg: TJPEGImage;
begin
 Extention := Ansilowercase(Extractfileext(sFoto.FileScr));

 if (Extention = '.jpg') OR (Extention = '.jpeg') then
 begin    ///  JPGS schnell!!!!  ---------------------------------
  LadBitmap := TBitmap.Create;
  Vorschau := TBitmap.Create;
  jpg := TJPEGImage.create;
  jpg.LoadFromFile(sFoto.FileScr);
  jpg.Scale := jsEighth;  // schnell, da nur 1/8 der Größe
  LadBitmap.Assign(jpg); // rüberkopieren

  Vorschau.Canvas.StretchDraw(Rect(0,0,VorschauGr,VorschauGr),LadBitmap);
 
  jpg.Free;
  LadBitmap.Free;
end;
Vielleicht für einen Eintrag in die Code-Lib zu gebrauchen? :drunken:

alcaeus 14. Jun 2005 00:02

Re: Vorschaubilder ähnlich schnell wie Win-XP erstellen
 
Zitat:

Zitat von axelf98
Vielleicht für einen Eintrag in die Code-Lib zu gebrauchen? :drunken:

Ja, warum nicht. Poste den Code einfach in ein neues Thema in der Codelib-Sparte, schreib eine kleine Erklaerung dazu und der Code wird anschliessend aufgenommen. Danke :)

Greetz
alcaeus

axelf98 14. Jun 2005 00:29

Re: Vorschaubilder ähnlich schnell wie Win-XP erstellen
 
Schon passiert!

Matze 14. Jun 2005 00:30

Re: Vorschaubilder ähnlich schnell wie Win-XP erstellen
 
Aber dann bitte mit Resoucenschutzblöcken und "FreeAndNil" anstelle von "Free" danke. ;)

Bsp:

Delphi-Quellcode:
CreateBitmap;
try
  DoSomething;
finally
  FreeAndNil();
end;

Nachtrag: AH, hast du nun ja drin. :thumb:

negaH 14. Jun 2005 05:58

Re: Vorschaubilder ähnlich schnell wie Win-XP erstellen
 
Das geht bei weitem schneller :)
In den heutigen JPEG's der DigiCam's sind parallel zum Bild im Header ein Thumbnail gespeichert. Üblicherweise hat dieses eine Größe von 160*80 Pixel oä. Also schon bei der Erzeugung der rießigen JPEG erzeugt die DigiCam auch ein Thumbnail und speichert beides in eine JPEG Datei. Hier im Forum müsstest du nach EXIF suchen und auf einen Source jeweils von Luckie und einem von mir stoßen. Beide können dieses Thumbnail extrahieren.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 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 by Thomas Breitkreuz