# Thumbnails schneller erstellen



## m@nu (7. Okt 2005)

hi zusamm'n

momentan benutze ich folgenden code, um thumbnails für meine fotoverwaltung zu erstellen:

```
/* Vorbereiten: */
                // Bild holen & in BufferedImage umwandeln:
                Image input = Toolkit.getDefaultToolkit().getImage(imageBean.getFile());
                BufferedImage original = GUIHelper.toBufferedImage(input);
                
                // Grössen berechnen:
                int imgWidth = original.getWidth();
                int imgHeight = original.getHeight();
                int scaledWidth  = 0;
                int scaledHeight = 0;
                int resizedSide = THUMBNAIL-2*THUMBNAIL_MARGIN;
                
                if (imgWidth >= imgHeight) {
                    scaledWidth = resizedSide;
                    scaledHeight = (int)(((double)imgHeight / (double)imgWidth) * (double)resizedSide);
                } else {
                    scaledHeight = resizedSide;
                    scaledWidth = (int)(((double)imgWidth / (double)imgHeight) * (double)resizedSide);
                }
                
                /* Bild verkleinern: */
                // Verkleinern:
                Image resized = input.getScaledInstance(scaledWidth, scaledHeight, Image.SCALE_SMOOTH);
         
                // Warten bis alle Daten da sind:
                MediaTracker tracker = new MediaTracker(new Canvas());
                tracker.addImage(input,1);
                tracker.addImage(resized,2);
                try {
                    tracker.waitForAll();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                /* Thumbnail erstellen: */
                BufferedImage thumbnail = new BufferedImage(scaledWidth, scaledHeight, BufferedImage.TYPE_INT_BGR);
                thumbnail.getGraphics().drawImage(resized, 0, 0, Color.BLACK, null);
                
                try {
                    ImageIO.write(thumbnail, "jpeg", new File("thumbnails/" + imageBean.getImageid()));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
```

nun ist die generierung bei grossen bildern (wies bei heutigen digicams halt normal ist) relativ langsam.
aus diesem grund werden die thumbnails nach dem ersten erstellen gecachte (siehe fünf-letzte zeile)

ich biete meinem user einen assistenten zum importieren von neuen bildern in die datenbank an. dort kann er wählen, welche bilder aus einem ordner er importieren möchte. es scheint mir arg übertrieben, dort mit dem obigen algorithmus für jedes "eventeuelle" bild bereits ein thumbnail zu generieren.

gibt es eine möglichkeit, den prozess zu optimieren? (vielleicht mit einer anderen library etc.?)

vielen dank für ideen & tipps!


----------



## byte (7. Okt 2005)

du kannst performance rausholen, indem du einen anderen algorithmus zum skalieren der bilder benutzt. Image.SCALE_SMOOTH sieht zwar hübsch aus, aber braucht bei größeren bildern doch ein wenig zeit. wenn du stattdessen z.b. SCALE_FAST benutzt, geht das wesentlich schneller, allerdings ist die qualität dann nicht so gut.


----------



## m@nu (7. Okt 2005)

danke, werde diesen weg für den import-assistenten mal versuchen


----------

