Bilder als "Thumbnails" laden - Performance

Status
Nicht offen für weitere Antworten.
F

Freecastle

Gast
Hallo,

ich habe ein Programm, welches unter anderem aus einem Ordner alle Bilder lädt und diese dann zur besseren Ansicht verkleinert (z.B. 64x64 Pixel) darstellt. Diese Bilder können bis zu 1,5 Mb groß sein.
Wenn ich z.B. aus einem Ordner so an die 15 Bilder lade, dann dauert das schon *sehr* lange. Also ich denke 2-3 Minuten sind dafür absolut nicht akzeptabel.
Meine Vorgehensweise ist die folgende: Ich lade jedes Bild der Reihe nach mit ImageIO.read(). Zum Skalieren erzeuge ich mit der Methode getScaledInstance() (von BufferedImage) ein Image das die korrekte Größe hat (also z.B. 64x64). Daraufhin erzeuge ich ein neues BufferedImage mit dieser Größe und zeichne mit drawImage() das skalierte Bild darauf. Dieses Image platziere ich dann in ein Panel (welches natürlich auch diese Größe hat). Funktionieren tut das einwandfrei... aber wie gesagt die Performance lässt sehr zu wünschen übrig. Da gibts doch bestimmt noch bessere Wege, damit das ganze effizienter wird, oder ?

Ich weiß auch nicht, ob das hier das richtige Forum dafür ist... evtl. passt das auch besser ins Swing-Forum...
Naja bin jedensfalls für jede Hilfe dankbar
 

André Uhres

Top Contributor
Neben der Codeoptimierung käme vielleicht auch ein Thumbnailsordner in Betracht,
in welchem die Bilder als Thumbnails abgespeichert sind (Dateien im passenden Kleinformat).

Das Laden müsste ja rein theoretisch mit den kleineren Dateien schneller gehen.

Der Thumbnailsordner muss natürlich zuerst angelegt und gefüllt werden,
was wiederum zeitaufwendig sein mag, sich aber dennoch lohnen könnte im Fall wo die
Bildersammlung ziemlich statisch ist und ein einmaliges/seltenes Erstellen der Thumbnails genügt.
 
F

Freecastle

Gast
Also ich habe eine Methode, welche die eigentliche Arbeit macht:

Code:
public final Image getScaledImage(File file, int width, int height) throws IOException {
		
		//Bild einlesen
		BufferedImage image = ImageIO.read(file); 
	
		//Skalieren...
		Image scaled = image.getScaledInstance(width,height,Image.SCALE_SMOOTH);
		
		//... und in einer neuen Image-Instanz das skalierte Bild speichern
		image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		image.createGraphics().drawImage(scaled,0,0,null);

		return image;
	}


Ich habe eine Collection, in welcher ich alle zu ladenden Bilder als File-Objekte drin habe. Diese iteriere ich in einer simplen For-Schleife durch und rufe dann eben für jede Datei diese Funktion auf (Gut, hinzu kommt dann eben noch Code um die Bilder in ein Array von Panels reinzuplatzieren, aber das ist hier auf keinen Fall der Flaschenhals, zudem erstelle ich das Panel-Array schon vorher).

Das mit dem Thumbnails-Ordner ist zwar eine gute Idee, kommt für mein Programm aber nicht in Betracht, da man mit dem Programm vielleicht einmal alle Bilder aus Ordner xyz öffnen will, und später dann vielleicht alle Bilder aus Ordner abc usw... Und auch nach Programmende wird man wohl so gut wie nie genau denselben Ordner noch einmal so öffnen wollen...

Also mir ist sehr wohl bewusst, dass das schon seine Zeit brauchen kann viele (und vor allem auch große) Bilder in verkleinerter Ansicht ins Programm reinzuladen, aber wie gesagt eine Zeit von z.B. knapp 3 Minuten für ca 14-15 Bilder ist doch recht inakzeptabel, vor allem da es ja auch Anwendungen gibt die ähnliches *viel* effizienter leisten
 

André Uhres

Top Contributor
Freecastle hat gesagt.:
..da es ja auch Anwendungen gibt die ähnliches *viel* effizienter leisten
Ich weiss nicht ob es dir hilft, aber hier ist die loadImage() Methode aus meinem Albumprogramm.
In einem Test hat es 63 Bilder von insgesamt 25MB in 22 Sekunden als Thumbnails geladen.
Die Performanz hängt natürlich auch vom Rechner ab:
Code:
   public void loadImage() {
        if (file == null) {
            thumbnail = null;
            return;
        }
        ImageIcon tmpIcon = new ImageIcon(file.getPath());
        if (tmpIcon != null) {
            if( tmpIcon.getIconWidth() >= tmpIcon.getIconHeight() ){
                //landscape
                if ( tmpIcon.getIconWidth() > dimemsion.width  ) {
                    thumbnail = new ImageIcon(tmpIcon.getImage().getScaledInstance(
                            dimemsion.width, -1, Image.SCALE_DEFAULT));
                } else { //no need to miniaturize
                    thumbnail = tmpIcon;
                }
            }else{
                //portrait
                if ( tmpIcon.getIconHeight() > dimemsion.height  ) {
                    thumbnail = new ImageIcon(tmpIcon.getImage().getScaledInstance(
                            -1, dimemsion.height, Image.SCALE_DEFAULT));
                } else { //no need to miniaturize
                    thumbnail = tmpIcon;
                }
            }
        }
    }
Mein Albumprogramm ist eigentlich eine Unterfunktion in meinem Malprogramm (Menüpunkt: Anzeigen | Album).
Es hat zwar auch noch einige Optimierungen nötig, aber hier kannst du die aktuelle Version schonmal
runterladen zum Testen: http://www.geocities.com/uhrand/Malprogramm.zip
 
F

Freecastle

Gast
Deine loadImage()-Methode hat mir sehr geholfen :)
Ich hab jetzt mal ne exakte Messung gemacht, und da wo ich vorher so 2-3 Minuten brauchte (konnte ich ja von meiner Uhr ablesen, da es so lange ging ;) ), braucht das Programm jetzt für 15 Bilder mit einer Gesamtgröße von ca. 22 MB relativ genau 19,9 s (also 20 s). Und das ist auf jeden Fall akzeptabel.
Ich hatte zu Beginn sogar auch einen ähnlichen Ansatz wie du, also dass ich die Bilder ohne ImageIO, sondern "normal" mit ImageIcons lade, aber ich hatte beim Skalieren einen Fehler drinnen, wodurch zwar die Bilder verkleinert dargestellt wurden, aber die Bilder trotzdem noch den gleichen Speicher belegten (ist mir jetzt auch grade erst durch deine Methode klar geworden). Und so hab ich da dann halt ständig OutOfMemory-Fehler gekriegt.
Also danke auf jeden Fall :)

Mal noch ne andere Frage: Kann es eventuell noch lohnen etwas an den Compilereinstellungen zu verändern ? Also z.B. anstatt dynmaischer Bindung statische Bindung zu benutzen usw ?
 

Wildcard

Top Contributor
@Freecastle
Wenn du dir ein Graphics Objekt erzeugst solltest du anschließend dispose() aufrufen um die Resourcen wieder freizugeben.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
8u3631984 Bilder in Datenbank speichern - sinnvoll Allgemeine Java-Themen 5
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
B Dateien / Bilder von "webapp" Ordner bekommen? Allgemeine Java-Themen 1
B Java Mail: Unterscheidung bei Attachments und eingefügte Bilder in Email Allgemeine Java-Themen 18
V Bilder bei bestimmten Zeiten wechseln, bitte um Hilfe Allgemeine Java-Themen 5
J Bilder lassen sich nicht importieren Allgemeine Java-Themen 3
S Bilder/Grafiken (zb: ".jpg") gestaucht zu Anzeige bringen Allgemeine Java-Themen 4
C Position von Pixeln in Bilder auslesen Allgemeine Java-Themen 2
The Pi NetBeans Bilder in Jar Datei werden nicht angezeigt Allgemeine Java-Themen 7
L Bilder innerhalb der JAR Datei Allgemeine Java-Themen 2
A 2 Bilder übereinander legen Allgemeine Java-Themen 5
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
P Datentypen Bilder werden in ausführbarer JAR nicht angezeigt Allgemeine Java-Themen 6
OnDemand Bilder herunterladen Allgemeine Java-Themen 11
Tacofan Bilder in Resource speichern Allgemeine Java-Themen 6
V Input/Output Gif Bilder Animiert aus einer Jar laden Allgemeine Java-Themen 4
F Bilder aus Subpackage entnehmen Allgemeine Java-Themen 2
J Bilder halb in falscher Farbe nach kopieren aus Web Allgemeine Java-Themen 3
A JTable Bilder Allgemeine Java-Themen 1
P OpenCV mit Java - Bilder in Graustufenbilder umwandeln Allgemeine Java-Themen 2
M Barcode und Bilder in PCL einbinden Allgemeine Java-Themen 0
H Mehrere Bilder aus einer Datei lesen Allgemeine Java-Themen 2
A Bilder vergleichen auf gleichheit oder ähnlichkeit Allgemeine Java-Themen 8
F Java Api Bilder speichern Allgemeine Java-Themen 3
J Bilder in Eclipse überlappen Allgemeine Java-Themen 4
M Bilder aus Excel auslesen Allgemeine Java-Themen 6
S Bilder Zippen Allgemeine Java-Themen 3
Z Bilder aus JAR laden Allgemeine Java-Themen 2
R Exec. Jar läd Bilder nicht! Allgemeine Java-Themen 5
D auf Bilder im Jar-Archiv zugreifen Allgemeine Java-Themen 11
P JAVA Bilder/Videos in Form von Files vergleichen Allgemeine Java-Themen 7
M Input/Output Mehrere Bilder aus Resourcen auslesen Allgemeine Java-Themen 8
K Eclipse Export - Bilder finden Allgemeine Java-Themen 7
K Bilder zerschneiden, stichwort: SLICE Allgemeine Java-Themen 3
M Eclipse Stackoverflow beim Einlesen von großen Bilder in kd Baum Allgemeine Java-Themen 15
M keine Bilder in .jar-Datei (java) Allgemeine Java-Themen 23
D Bilder in JFrame anzeigen Allgemeine Java-Themen 5
K Inputstream -> Bilder Allgemeine Java-Themen 23
JAVAnnik Bilder in JLabel Array einfügen Allgemeine Java-Themen 2
A Problem mit Bilder laden mit sum.kern Allgemeine Java-Themen 9
C Bilder speichern Allgemeine Java-Themen 12
Z 2D-Grafik Webcam-Bilder analysieren und manipulieren Allgemeine Java-Themen 8
D Bilder extrahieren aus EPS - Problem mit ASCII85 Allgemeine Java-Themen 2
D Bilder aus externer .jar laden Allgemeine Java-Themen 3
S Swing mit JEditorPane per HTML auf Bilder in JAR zugreifen. Allgemeine Java-Themen 3
F Kleingerechnete Bilder extrem dunkel Allgemeine Java-Themen 2
SuperSeppel13 Bilder auf Anfrage laden - Threading Allgemeine Java-Themen 3
C Bilder rotieren, Denkfehler in der Berechnung? Allgemeine Java-Themen 2
S Mittels eines Applets Bilder generieren die in einer Webseite angezeigt werden..? Allgemeine Java-Themen 8
C Bilder verkleinern und zusammenführen Allgemeine Java-Themen 5
hdi Bilder JAR-kompatibel machen Allgemeine Java-Themen 7
K Transparente Bilder in Bild positionieren und speichern. Allgemeine Java-Themen 5
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
A Beim Kopieren werden Bilder verfälscht Allgemeine Java-Themen 3
O Große Anzahl Bilder laden Allgemeine Java-Themen 7
data89 Bilder mit Java prüfen - suche dringend Hilfe Allgemeine Java-Themen 8
S Bilder aus jarDateien laden Allgemeine Java-Themen 13
R Bilder von flickr runterladen? Allgemeine Java-Themen 3
Fadi Lade Bilder aus einem Jar File Allgemeine Java-Themen 6
D Bilder einer Webseite herunterladen Allgemeine Java-Themen 2
C Externe Bilder in Java-Applet blocken? Allgemeine Java-Themen 2
C Alle Bilder eines binären Arrays ausgeben Allgemeine Java-Themen 3
G Bilder einer Webcam im JFrame anzeigen Allgemeine Java-Themen 5
T Webseiten durchsuchen und Bilder downloaden Allgemeine Java-Themen 4
C Bilder automatisch bearbeiten/manipulieren Allgemeine Java-Themen 2
G Peformance Bilder laden? Allgemeine Java-Themen 3
G Bilder in javadoc einbinden Allgemeine Java-Themen 5
H Bilder werden nicht angezeigt Allgemeine Java-Themen 7
G Bilder skalieren Allgemeine Java-Themen 2
K Bilder mit Java in MS Word einfügen Allgemeine Java-Themen 2
G Bilder werden in .Jar nicht angezeigt! Allgemeine Java-Themen 2
B zwei Bilder miteinander vergleichen Allgemeine Java-Themen 25
N Bilder in DB oder im Filesystem speichern Allgemeine Java-Themen 3
K bilder laden im voraus Allgemeine Java-Themen 7
Chris_1980 Bilder u. Objekte in JarArchiv speichern Allgemeine Java-Themen 2
S Buttons über Bilder? Allgemeine Java-Themen 18
F Mehrere Bilder zu einem Großen zusammenkleben Allgemeine Java-Themen 3
N Auf Bilder / Dateien innerhalb eines jar-Archives zugreifen Allgemeine Java-Themen 2
H Bilder richtig speichern und laden Allgemeine Java-Themen 4
TheJavaKid Bilder in die Registries Allgemeine Java-Themen 7
byte Fehlerhafte Bilder reparieren? Allgemeine Java-Themen 11
M Bilder abspielen mit Übergängen Allgemeine Java-Themen 12
G bilder in jar Allgemeine Java-Themen 6
T Bilder schnell in BufferedImage laden Allgemeine Java-Themen 4
T Bilder bearbeiten unglaublich langsam Allgemeine Java-Themen 9
G Bilder für Buttons in JarFile Allgemeine Java-Themen 5
Linad Bilder auf Gleichheit prüfen Allgemeine Java-Themen 6
G Bilder zeichnen und Zoom Funktion Allgemeine Java-Themen 2
G Bilder in JAR-File finden Allgemeine Java-Themen 5
E Warum werden Bilder nicht angezeigt? Allgemeine Java-Themen 3
M GIF-Bilder in JAR-Files Allgemeine Java-Themen 5
M Bilder-Ordner kann im JAR-File nicht gefunden werden Allgemeine Java-Themen 15
M Bilder in ein Array? Allgemeine Java-Themen 3
P Bilder aus Jar Allgemeine Java-Themen 2
D Bilder einlesen, bearbeiten und wieder in Datei schreiben Allgemeine Java-Themen 3
J Problem mit .jar Archiv und Bilder Allgemeine Java-Themen 6
bummerland bilder im jar-archiv? Allgemeine Java-Themen 2
T Thumbnails erstellt: Total schlechte Qualität: Allgemeine Java-Themen 2
m@nu Thumbnails schneller erstellen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben