Holger Janßen-Kroll

Beratung · Entwicklung · Internet

Bildersammlung verkleinern

Einleitung

Die Aufgabe an sich ist recht simpel: Eine beliebig verschachtelte Bildersammlung durchsuchen und alle "großen" Bilder verkleinern. Entsprechend meiner konkreten Aufgabe definiere ich hier "groß" als "größer als 3.500 Pixel".

Für diese Bilder soll jeweils eine verkleinerte Kopie erzeugt werden. Wenn die Datei statt dessen einfach ersetz werden soll, wird das Script noch ein bisschen einfacher. (s.u.)

Das Script

#! /bin/bash

IFS=$'\n'
for FILE in $(find -regextype awk -iregex '.*(jpe?g|png)$' -print); do 
	HEIGHT=$(identify -format "%H" "$FILE"); 
	WIDTH=$(identify -format "%W" "$FILE"); 

	if (( $HEIGHT >= 3500 || $WIDTH >= 3500 )); then
		echo $FILE ": " $HEIGHT "x" $WIDTH; 

		EXT="${FILE##*.}"
		FILENAME="${FILE%.*}"
		COPY="$FILENAME.SMALLER.$EXT"
	
		echo "    -> creating $COPY"

		convert -resize 3500x2500 "$FILE" "$COPY"
	fi;
done

Erläuterungen

  • Zeile 3: Die Systemvariable IFS (kurz für Internal Field Separator, interner Feldtrenner) enthält die Zeichen, die zum Aufteilen einer Eingabe z.B. für eine for-Schleife verwendet werden. Standardmäßig werden dafür Leerzeichen, Tab und Newline verwendet. Dies würde bedeuten, dass Dateinamen, die ein Leerzeichen enthalten, in mehrere Teile aufgetrennt würden. IFS auf Newline einzuschränken verhindert dies in Verbindung mit dem -print-Schalter von find.
  • Zeile 4: Der find-Aufruf durchsucht das aktuelle Verzeichnis nach Dateien, die unabhängig von der Groß-/Kleinschreibung auf .jpg, .jpeg oder .pne enden.
  • Zeile 11&12: Die Bash-Variablenersetzung kann auch einfache Textbearbeitungen wie das Abschneiden von Prä- und Suffixen übernehmen. Auf diese Weise kann man Dateiendungen (alles nach dem letzten ".") erhalten oder abschneiden.
  • Zeile 17: Wenn man die ursprüngliche Datei durch die kleinere Kopie ersetzen möchte, reicht an dieser Stelle ein einfaches
    mogrify -resize 3500x3500 $FILE

Zurück


Einen Kommentar schreiben

Bitte addieren Sie 5 und 8.