Schnelleres Einlesen von Images

Kenan89

Bekanntes Mitglied
Hallo Leute,

ich habe ein Programm geschrieben, der ein Bild anzeigt UND auf einem weiteren Panel alle weiteren Bilder, die sich im gleichen Verzeichnis befinden als Thumbnails darstellt.

Das Problem ist, dass ich bisher nur mit wenigen und kleinen Dateien getestet habe.

Befinden sich viele große Dateien in einem Ordner, dauert erstens das Lesen zu lange (BufferedImage bImg = ImageIO.read(file)) und zweitens kriege ich outOfMemory da die VM wohl kein Speicher mehr hat.

Meine Frage ist hauptsächlich, wie ich das Einlesen beschleunigen kann.

Der Source Ordner befindet sich im Anhang. Es funktioniert, sobald ihr die Variable url in der Klasse Exe im package exe umändert in ein Verzeichnis, wo viele und große Bilder sind. (Ich habe zu Testzwecken große Bilder von einer Landschaft aus Google heruntergeladen und diese einfach kopiert, ist ja egal, wenn es 100x die gleichen Bilder sind. Es geht nur darum dass er die großen Bilder schnell liest.)

Ich wäre auch für eventuelle andere "Tuning-Tipps" dankbar, falls ihr welche entdeckt.

Zusatzinfo: Das Programm ist so keinesfalls fertig, und hat auch mir noch einige bekannte Schwächen, aber vorerst geht es nur um das schnellere Einlesen der Bilder im Verzeichnis. 🙂

Ich bedanke mich jetzt schon einmal im voraus.

EDIT: Also bei meine Testbedingungen waren:
-75 Bilder zu je 1920 * 1080 jeweils 635 KB
Ein paar weitere Informationen: Das Einlesen der Bilder geschieht in der Klasse Thumbnail im package gui.
 

Anhänge

Zuletzt bearbeitet:
Ich kann jetzt nix dazu sagen, wie du dein Programm tunen kannst.

Aber überleg dir mal, wie Windows mit der Thumbnail Ansicht im Explorer umgeht. Beim ersten Lesen erstellt er eine kleine Datenbank im Ordner mit den Miniaturansichten und zeigt diese an. M$ hätte hier das gleiche Problem wie du, wenn die alle Bilder immer in Maximalauflösung einlesen und darstellen. Dann lägen wohl die Hardwareanforderung von Windows bei ca. ein paar 100 GB RAM. Vor allem, wenn man über ne langsame Netzwerkleitung auf den Ordner zugreift merkt man das ganz deutlich.
 
Mir ist noch eine weitere Möglichkeit eingefallen. Wie wäre es denn wenn man einfach
mehrere Threads erstellt und jedes Thread erstellt ein neues Thumbnail Objekt und fügt es
dem Panel hinzu.
Ansonsten ist es so, dass IMMER darauf gewartet werden muss, dass erst ein Bild hineingeladen worden ist, bevor das nächste geladen wird.

@Datenbank
Davon hatte ich auch mal gelesen gehabt, dass die Bilder wohl gecacht werden können, sodass die Anzeige nur beim ersten Start so lange dauert.
Momentan habe ich nämlich ca 75 große Testbilder in meinem Verzeichnis und für jede braucht java ca 0.5 Sekunden, also ca 33 Sekunden bis alle Bilder geladen sind.

Was genau ist ausserdem mit Datenbank erstellen gemeint? Meinst du eine Tabelle in einer, z.B. postgres, mysql,... Datenbank?

@marco13
leider dauert das Einlesen sehr lange. Skallieren geht relativ flott.
 
ich kann nicht wirklich mitreden, aber falls die Betonung des Stichworts hilft und das Programm es nicht zwingend erfordert (nicht angeschaut):
speziell BufferedImage ist doch glaube ich langsam und größtmöglich,
wandelt das Bild so um dass alles als Buffer zur Bearbeitung jedes Pixels vorliegt

ist das wirklich nötig oder geht auch irgendeine andere sparsamere Darstellung?
zu genauen Formaten, Laden, möchte ich wie gesagt nix vorschlagen
 
Was genau ist ausserdem mit Datenbank erstellen gemeint? Meinst du eine Tabelle in einer, z.B. postgres, mysql,... Datenbank?

Naja, das ist dir überlassen. M$ legt ein unsichtbares File ab, in dem die Daten liegen. Du kannst natürlich eine embedded Datenbank mit deiner Anwendung starten, in der du deine Daten ablegst. Es muss ja keine SQL DB sein. Du könntest auch ein DB4O nehmen in der du einfach deine Objekte in ein File legst, oder du erstellst dir dein eigenes Dateiformat oder BASE64 Codiert in einem XML File .....
Also du hast da alle Freiheiten, die dir einfallen.
 

Zurück
Oben