Bilder automatisiert drehen – Kurz programmieren, viel Zeit sparen
Ich hatte den Fall, dass ich alle Bilder in einem Ordner um 180 Grad drehen musste. Das das aber sehr mühsam und nervig wäre, macht man sowas als Entwickler natürlich nicht von Hand. Da werden lieber ein paar Minuten in einen kleinen Code investiert um das zu automatisieren.
Vorab: dieses Skript ähnelt bis auf die Abweichungen in den imagemagick
-Befehlen sehr dem aus meinem Beitrag zum “Instagram image auto reize and watermark script“, daher ist dieser Beitrag etwas kürzer gefasst.
Voraussetzungen und Setup
Es handelt sich hier um ein Shell
-Skript, das einfach in irgendeinem Terminal mit bash
aufgerufen werden kann. Dafür braucht es also nichts spezielles. Ich verwende als Entwicklungsumgebung für so etwas gerne Visual Studio Code, allerdings muss hier im Skript per se nur wenig modifiziert werden, sodass auch eine Entwicklungsumgebung nicht unbedingt notwendig ist.
Dennoch müssen ein paar Pakete installiert werden, damit das Skript genutzt werden kann.
Installation von Paketen
Gebraucht werden die Pakete coreutils
und imagemagick
. ImageMagick ist eine Open Source-Software zum Editieren und Manipulieren von Bild-Dateien, die im Skript für die Skalierung und die Beschriftung der Bilder verwendet wird.
Setup für MacOS
Die Pakete können ganz einfach mit Homebrew installiert werden.
brew install coreutils
brew install imagemagick
Setup für Windows
Die Pakete können ganz einfach mit Chocolatey installiert werden.
choco install gnuwin32-coreutils.install
choco install imagemagick
Zum Code
Das Skript soll beim Aufruf einen Dateipfad zum Zielordner als Parameter entgegennehmen, den entsprechenden Ordner systematisch durchgehen und die Bilder darin bearbeiten. Jedes Bild soll ein Mal um 180 Grad gedreht werden.
Voraussetzungen prüfen und Unterordner erstellen
Zuerst werden die Vorraussetzungen geprüft. Ob die nötigen Pakete installiert sind und der Zielordner existiert. Danach wird der /rotated
-Ordner für die bearbeiteten Bilder erstellt. Für eine ausführlichere Erklärung kannst du einen Blick in meinen anderen Beitrag zu “Instagram image auto reize and watermark script” werfen.
Bilder rotieren
Nun zum interessanten, wenn auch zugegebenermaßen recht simplen, Teil. Es wird mit Hilfe einer for
-Schleife durch alle Bilder iteriert. Von jeder Bild-Datei im Ordner wird der Dateiname gelesen, der String vor der Endung in FN_CUT
gespeichert und daraus der neue Dateipfad FN_ROTATED
im /rotated
-Ordner gebildet. Jedes Bild wird aus dem Zielordner entnommen, um 180 Grad gedreht und unter dem neuen Dateinamen abgespeichert.
for FN in *.jpg *.jpeg *.JPG *.JPEG *.HEIC *.heic *.png *.PNG *.tiff *.TIFF *.raw *.RAW *.RW2; do
echo "$COUNTER PROCESSING: >$FN<"
((COUNTER++))
FN_CUT="${FN%.*}"
FN_ROTATED=$DIR_ROTATED/$FN_CUT"-rotated.jpg"
CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -rotate 180 -quality $QUALITYJPG \"$FN_ROTATED\" "
eval "$CMD"
done
Der vollständige Code
#! /bin/bash
# 2023-10-10 ramona.gloetter.de
# Setup on Mac:
# brew install imagemagick
# Setup on Windows:
# choco install imagemagick
_self="${0##*/}"
echo "$_self is called"
if [[ $# -eq 0 ]]; then
echo "Usage: $(basename "$0") [Picture-Foldername]"
exit 1
fi
shopt -s nullglob
# use the nullglob option to simply ignore a failed match and not enter the body of the loop.
COMPOSITE=$(which composite) # path to imagemagick compose
CONVERT=$(which convert)
QUALITYJPG="85"
UBUNTU=$(grep -i "ubuntu" </etc/issue)
if [ $? -eq 0 ]; then
echo "$UBUNTU detected"
DIR_SCRIPT=$(dirname "$(readlink -f "$0")")
DIR_SRCIMG=$(readlink -f "$1") # works on all *nix systems to make path absolute
else
echo "MacOS detected"
DIR_SCRIPT=$(dirname "$(greadlink -f "$0")")
DIR_SRCIMG=$(greadlink -f "$1") # works on all *nix systems to make path absolute
fi
DIR_BASE=$(pwd)
DIR_ROTATED=$DIR_SRCIMG"/rotated"
# create /rotate folder
if [ -d "$DIR_ROTATED" ]; then
echo "${DIR_ROTATED} exists -> OK"
else
mkdir "$DIR_ROTATED"
echo "Error: ${DIR_ROTATED} not found. Creating."
fi
# check if it worked
if [ ! -d "$DIR_ROTATED" ]; then
echo "Error: ${DIR_ROTATED} CAN NOT CREATE --> EXIT."
fi
cd "$DIR_SRCIMG" || exit 1
for FN in *.jpg *.jpeg *.JPG *.JPEG *.HEIC *.heic *.png *.PNG *.tiff *.TIFF *.raw *.RAW *.RW2; do
echo "$COUNTER PROCESSING: >$FN<"
((COUNTER++))
FN_CUT="${FN%.*}"
FN_ROTATED=$DIR_ROTATED/$FN_CUT"-rotated.jpg"
CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -rotate 180 -quality $QUALITYJPG \"$FN_ROTATED\" "
eval "$CMD"
done