Einführung

Wenn man im Internet eine Fotogalerie publizieren will, oder man viele Fotos per E-Mail verschicken will, sollte man die Fotos verkleinern. Ich habe mir ein Skript geschrieben, welches die Auflösung der Bilder verkleinert und die JPEG-Qualitätsstufe heruntersetzt. Somit kann man ganz schnell viele Bilder verkleinern.

Einzelne Bilder verkleinern

Mit dem Befehl convert kann ein Bild verkleinert werden. Hierzu muss das Paket imagemagick installiert sein.

convert -resize 2048x2048 -quality 60 bild.jpg klein.jpg

Man sieht gut, wie sich die Dateigrösse verändert:

$ du -h bild.jpg klein.jpg
1.5M    bild.jpg
168K    klein.jpg

Die Datei wurde durch diesen Vorgang um 90% kleiner.

Skript um mehrere Bilder zu verkleinern

Um mehrere Bilder in einem Verzeichnis zu verkleinern, habe ich mir ein Skript geschrieben. Dieses Skript erstellt den Unterordner small, verkleinert alle Bilder und gibt aus, wie viele Fotos bereits verkleinert wurden.

#!/usr/bin/env bash

# Variabeln
COUNT=0
TOTAL=`echo *.[Jj][Pp][Gg] | wc -w`

# Optionen
FOLDER="small"
SIZE="2048x2048"
QUALITY="60"

mkdir $FOLDER

for datei in *.[Jj][Pp][Gg]
do
  COUNT=`expr $COUNT + 1`
  echo $datei: Foto $COUNT von $TOTAL \(`expr 100 \* $COUNT / $TOTAL`%\)
  convert -resize $SIZE -quality $QUALITY "$datei" "$FOLDER/$datei"
done

Die Auflösung und die JPEG-Qualitätsstufe kann in den Variabeln angepasst werden.

Die aktuellste Version des Skripts ist auf GitHub in meinem Scripts repository zu finden: imageshrink.

Shell-Funktion

Alternativ kann dies auch als Shell-Funktion in der Datei ~/.bashrc definiert werden:

imageshrink () 
{ 
    local quality="75";
    local size="2048x2048";
    local outputdir="./small";
    mkdir "$outputdir" || return 1;
    for image in "$@";
    do
        echo "[*] Shrinking $image to $outputdir/$image ...";
        convert -resize "$size" -quality "$quality" "$image" "$outputdir/$image";
    done
}