Frage

Ich brauche Thumbnails von Bildern in einem bestimmten Verzeichnis angezeigt werden soll. Ich benutze TFileStream die Image-Datei zu lesen, bevor das Bild in ein Bildkomponente zu laden. Die Bitmap wird dann an den Miniaturgröße verkleinert und auf ein TImage Komponente auf einem TScrollBox zugeordnet.

Es scheint ok zu arbeiten, aber verlangsamt ziemlich viel mit größeren Bildern.

Gibt es einen schnelleren Weg zum Laden (Bild) Dateien von der Festplatte und Ändern der Größe ihnen?

Danke, Pieter

War es hilfreich?

Lösung

Nicht wirklich. Was Sie tun können, ist, sie in einem Hintergrundthread Größe ändern, und ein „Platzhalter“ Bild verwenden, bis die Größenanpassung erfolgt. Ich würde dann diese Größe verändert Bilder auf eine Art Cache-Datei für die spätere Verarbeitung speichern (Fenster tut dies, und ruft den Cache thumbs.db im aktuellen Verzeichnis).

Sie haben mehrere Möglichkeiten auf der Thread-Architektur selbst. Ein einzelner Faden, der alle Bilder der Fall ist, oder ein Thread-Pool, wo ein Thread nur weiß, wie man ein einzelnes Bild zu verarbeiten. Die AsyncCalls Bibliothek ist auch eine andere Art und Weise und kann die Dinge ziemlich einfach.

Andere Tipps

Ich werde die Antwort von skamradt mit dem Versuch, ergänzen diese zu entwerfen, so schnell wie möglich zu sein. Dazu sollten Sie

  • optimize I / O
  • verwenden mehrere Threads Verwendung mehrere CPU-Kern zu machen, und auch nur ein einziger CPU-Kern arbeiten zu halten, während Sie lesen (oder schreibt) Dateien

Die Verwendung von mehreren Threads bedeutet, dass mit VCL-Klassen für die Größenanpassung wird nicht funktionieren, da die VCL ist nicht Thread-sicher, und alle Hacks um die Skalierung nicht gut. efg des Computerlabor Links für die Bildverarbeitung Code hat.

Es ist wichtig, nicht mehrere gleichzeitige I / O-Operationen zu verursachen, wenn mehrere Threads verwendet werden. Wenn Sie die Miniaturbilder zurück, um Dateien zu schreiben wählen, dann, wenn Sie eine Datei zu lesen begonnen haben, sollten Sie es vollständig lesen, und wenn Sie begonnen haben, eine Datei zu schreiben, sollten Sie es auch komplett schreiben. Verschachtelung beide Operationen werden Ihre E / A töten, weil Sie möglicherweise eine Menge Suchoperationen der Festplattenkopf führen.

Für die besten Ergebnisse das Lesen (und Schreiben) von Dateien sollten auch in der Haupt (GUI) Thread Ihrer Anwendung nicht passieren. Das würde vorschlagen, die folgende Konstruktion:

  • Haben einen Thread lesen Dateien in TGraphic Objekte und setzen diese in eine Thread-sichere Liste.
  • Haben Sie einen Thread-Pool auf der Liste der Dateien in Originalgröße warten, und einen Thread Prozess einer TGraphic Objekt hat, die Größe in einer anderen TGraphic Objekt, und fügen Sie diese zu einer anderen Thread-sicher-Liste.
  • Benachrichtigen Sie den GUI-Thread für jede Miniaturansicht in die Liste aufgenommen, so kann es angezeigt werden.
  • Wenn die Thumbnails Datei geschrieben werden soll, tut dies auch in dem Lesefaden (siehe oben für eine Erklärung).

Edit:

Eine Re-Lektüre Ihre Frage, die ich feststellen, dass Sie vielleicht nur ein Bild, um die Größe benötigen, wobei in diesem Fall ein einzelner Hintergrundthread genug natürlich ist. Ich werde meine Antwort an Ort und Stelle sowieso verlassen, vielleicht wird es von Nutzen sein, jemand anderes einige Zeit. Es ist, was ich von einem meiner letzten Projekten gelernt, wo das endgültige Programm ein wenig mehr Geschwindigkeit hat benötigt konnte aber nur wurde mit etwa 75% der Quad-Core-Maschine zu Spitzenzeiten. I Entkoppelung / O aus der Verarbeitung den Unterschied gemacht hätte.

Ich verwende oft TJPEGImage mit Skala: = jsEighth (in Delphi 7). Das ist wirklich schnell, weil die JPEG-de-Kompression eine Menge der Daten überspringen kann eine Bitmap, nur ein Achtel der Breite und Höhe zu füllen.

Eine weitere Option ist die Shell-Methode zu verwenden, um einen Thumbnail- zu extrahieren, die ziemlich schnell ist wie gut

Ich bin in der Vision Geschäft, und ich einfach die Bilder auf die GPU laden OpenGL. (In der Regel 20-fach 2048x2000x8bpp pro Sekunde), eine bmp pro Textur, und lassen Sie die Grafikkarte Skala (win32, Mike Lischke OpenGL-Header)

Hochladen eines solchen Bildes Kosten 5-10ms auf genaue Grafikkarte abhängig (falls nicht integriert und nvidia 7300 Serie oder höher. Eine sehr neue integrierte GPUs könnte machbar sein auch). Skalierung und Kosten 300US anzeigt. Was bedeutet, Kunden wie verrückt schwenken und zoomen können die App ohne sie zu berühren. Ich zeichne ein Overlay (die eine TMetafile verwendet werden soll, ist aber jetzt ein eigenes Format) auf es.

Meine größte Bild ist 4096x7000x8bpp, die unter 30ms zeigt und Skalen. (GF 8600)

Eine Einschränkung dieser Technologie ist die maximale Texturgröße. Es kann durch Fragmentierung des Bildes in mehrere Texturen aufgelöst werden, aber ich habe noch nicht die Mühe gemacht, weil ich die Systeme mit der Software zu liefern.

(einige typische Größen: nv6x00 Serie: 2k * 2k aber Upload ist Pause nur um selbst zu GDI im Vergleich nv7x00 Serie: 4k * 4k Für mich sind die Baseline-Karten. GF7300 die sind wie $ 20-40 nv8x00 Serie: 8k * 8k )

Beachten Sie, dass dies nicht für jedermann sein könnte. Aber wenn man in der glücklichen Lage sind die Grenzen der Hardware zu geben, könnte es funktionieren. Das Hauptproblem sind Laptops wie Thinkpads, die GPUs davon sind älter als der avg Laptop, die wiederum oft eine Generation hinter Desktops.

Ich entschied ich für OpenGL über DirectX, weil es mehr statisch in der Zeit ist, und einfacher nicht-Spiel Beispiele zu finden.

Versuchen Sie auf der Graphics32 Bibliothek : es Zeichnung Dinge sehr gut ist und funktioniert em < > große mit Bitmaps. Sie sind Thread - Sicher mit gutem Beispiel, und es ist völlig kostenlos

.

Exploit Fenster Kapazität Thumbnails zu erstellen. Denken Sie daran, dass versteckte Thumbs.db Dateien in Ordnern, die Bilder enthalten?

Ich habe so etwas wie dieses Feature aber in VB umgesetzt. Meine Software ist in der Lage der Thumbnails von 100 Dateien (Mischgröße) zu bauen in rund 10 Sekunden.

Ich bin nicht in der Lage, es zu Delphi konvertieren though.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top