Allgemein,  Fotografie,  Programmieren

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
22720cookie-checkBilder automatisiert drehen – Kurz programmieren, viel Zeit sparen

Leave a Reply

Your email address will not be published. Required fields are marked *