Java Thumbs erzeugen

Thumbs erzeugen

Gerade Webautoren benötigen häufig Thumbs - kleine Versionen von höher aufgelösten Bildern.
Diese Bilder per HTML zu verkleinern wäre keine gute Idee, da der Browser vor dem Verkleinern dieser Bilder alle Bilddateien in ihrer vollen Größe vom Server laden müsste - genau das, was man als Webmaster nicht will.
Viel sinnvoller ist es, vorab eine verkleinerte Version der Bilder zu erzeugen und diese sogenannten Thumbs auf dem Webserver zu hinterlegen, so dass der Browser direkt auf diese verkleinderten Bilder zugreifen kann.

Das Problem in der Praxis: wie erstelle ich viele Thumbs auf einmal?
Mit einer Bildbearbeitungssoftware geht das zwar sehr gut und in hoher Qualität, aber wenn z. B. hunderte von Bildern zu verkleinern sind, scheidet die manuelle Bearbeitung aus Zeitgründen aus.
Man benötigt ein Tool, welches die Generierung von Thumbs im Batch durchführt.

Das hier vorgestellte sehr einfache Tool erfüllt genau diesen Zweck. Es nimmt drei Parameter von der Kommandozeile entgegen:

Um gegebenenfalls Quell- und Zielordner identisch halten zu können und / oder Thumbs in verschiedenen Größen zu erstellen, verwenden wir einen einfachen Trick: die neu erzeugten Bilddateien (=die Thumbs) werden im Dateinamen zur Unterscheidung vom Original die Bildbreite enthalten. Aus der Datei meinBild.jpg wird, wenn die Thumbs eine Breite von Beispielsweise 150 Pixel haben sollen, eine Datei mit dem Namen meinBild.150.jpg generiert.

Ansonsten ist das Tool absichtlich sehr einfach gehalten, so dass der Quellcode schnell verstanden und bei Bedarf angepasst werden kann.
Als extra Feature ist lediglich implementiert, dass vor dem Verkleinern geprüft wird, ob eine Zieldatei mit dem neu erzeugten Dateinamen bereits exisitert. Ist dem so, wird kein Thumb erzeugt und einfach mit dem nächsten Bild fortgefahren.
Auf diese Weise bleibt die Programmausführung sehr performant, wenn im Quell-Ordner nach einem ersten Generierungslauf nur wenige Bilder hinzugefügt werden, und die Generierung der Thumbs dann erneut gestartet wird: dann wird nur für die neu hinzugefügten Bilder ein Thumb erzeugt.

Hier ein Beispiel-Aufruf:

java ThumbGenerator c:\meineBilder c:\meineThumbs 150

Dieser Aufruf erzeugt Thumbs mit einer Breite von 150 Pixeln im Ordner meineThumbs, und zwar von jedem Bild im Ordner meineBilder.
Thumbs, die schon einmal erzeugt wurden, bleiben bestehen, so dass bei neu hinzugefügten Bildern der Programmablauf wie erwähnt sehr schnell bleibt.

Thumb Generator Java Quellcode

Genug erklärt - hier der Quellcode zum Generieren von Thumbs im Batch-Betrieb in Java mittels dem oben gezeigten beispielhaften Aufruf:
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class ThumbGenerator {
    public static void main(final String[] args) throws Exception {
        final int width = Integer.parseInt(args[2]);
        final File srcFolder = new File(args[0]);
        if (srcFolder.isDirectory()) {
            final File destFolder = new File(args[1]);
            if (destFolder.isDirectory()) {
                final File[] pictures = srcFolder.listFiles();
                for (int i = 0; i < pictures.length; i++) {
                    final String name = pictures[i].getName();
                    if (name.indexOf("_NOK") < 0) {
                        System.out.println("processing: " + name);
                        process(pictures[i], args[1], width);
                    } else {
                        System.out.println("ignore: " + name);
                    }
                }
            }
        }
    }

    public static void process(final File f, final String destFolder, final int width) throws Exception {
        String outFileName = f.getName();
        final int pos = outFileName.lastIndexOf('.');
        outFileName = outFileName.substring(0, pos) + "-" + width + outFileName.substring(pos);
        final File outFile = new File(destFolder + "" + outFileName);
        if (outFile.exists()) {
            System.out.println(" INFO: file already exists: " + outFile.getName() + ".");
        } else {
            final Image img = new ImageIcon(ImageIO.read(f)).getImage();
            final int height = img.getHeight(null) * width / img.getWidth(null);
            final Image scaledImage = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
            final BufferedImage outImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            final Graphics g = outImg.getGraphics();
            g.drawImage(scaledImage, 0, 0, null);
            g.dispose();
            ImageIO.write(outImg, "jpeg", outFile);
        }
    }
}

Dieses bewusst sehr einfach gehaltene Beispiel soll dazu einladen, den Generator für eigene Zwecke anzupassen.



Nach oben, Inhaltsverzeichnis, Impressum Admin: Artikel editieren