Im Urlaub habe ich jede Menge Fotos geschossen. Natürlich mit einer hochauflösenden Kamera. Um die Urlaubsfotos den Daheimgebliebenen zuzeigen eignet sich der Fernseher bestens. USB Stick dran gesteckt und los gehts. Allerdings hat jedes meiner hochauflösenden Bilder mehr als 5 MB. Kein Wunder, denn die Fotos meiner Kamera sind 5184x3456 Bildpunkte groß. Mein Fernseher kann aber nur Full HD, also 1980x1024 darstellen. Das bedeuted: er muss jedes Bild auf die eigentliche Bildauflösung herunterrechnen. Also zuerst Bild vom USB Stick laden (5MB) und dann herunterrechnen. Das dauert. Bei einer Diaschau merkt man keine Zeitverzögerung, will ich allerdings schnell man ein paar Fotos weiterschalten....
Zusätzlich hat mein 250,-€ Fernseher das Mako, dass er Bilder nicht automatisch dreht :-(
Ich will also alle Fotos in einem Verzeichnis automatisch verkleinern und automatisch drehen. Und das unter Ausnutzung aller CPUs in meinem Rechner.
Dies erledigen 2 Shellscripte für mich: parallel (Quelle: http://pebblesinthesand.wordpress.com/2008/05/22/a-srcipt-for-running-processes-in-parallel-in-bash/) Diesem Script übergibt man einen Menge Jobs, die zu starten sind. Es lässt aber immer nur so viele Jobs gleichzeitig laufen, wie CPUs vorhanden sind. Ist ein Job beendet wird sofort der nächste Job dazugestartet.
Das zeweite Script heißt mksmall welches mir als Frontend für das parallel Script dient. Es erzeugt einen Unterordner "small" in dem die verkleinerten Bilder abelegt werden und erkennt automatisch, wie den nun die Dateiendung für die zu verkleinerten Bilder in dem aktuellen Verzeichnis heißen. (JPEG, oder jpg,...)
Die eigentliche Arbeiterledigt dann convert aus dem Image Magick Paket.
Also um nochmal Shellscriptisch zu sprechen: Anstatt folgenden Code zu verwenden:
$ mkdir small
$ for i in *.jpg ; do
convert -auto-orient -geometry 1920x1080 $i small/small_$i ; done
done
tippe ich nun nur noch folgendes ein:
$ mksmall
Der Unterschied liegt in der Zeit, die für die Konvertierung benötigt wird: 3 Minuten 33 Sekunden (der traditionelle Weg) versus einer Minute und 51 Sekunden.