Allgemein,  Fotografie,  Programmieren

Instagram image auto resize and watermark script

Ist es nicht super nervig, wenn man Bilder auf Instagram hochlädt, die eigentlich super aussehen, dann aber von Instagram auf irgendeine dieser komischen Größen geschnitten werden?

Wenn man die Bilder doch nur schon vorher zugeschnitten hätte und nur noch nachsehen muss, welches der Formate am besten aussieht…

Dafür lässt sich sicher ganz einfach und möglichst schnell ein Skript schreiben, das das ganze für einen automatisiert durchspielt, oder?

Ganz genau!

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

Instagram-Formate

Nach einer kurzen Recherche bin ich auf folgende Instagram-Formate gestoßen, die im Skript berücksichtigt werden:

FormatVerhältnisMaße
Quadratische Posts1:11080 px x 1080 px
Querformat1,91:11200 px x 628 px
Hochformat4:51080 px x 1350 px
Story9:161080 px bis 1920 px

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 in jedes Format umberechnet und beschriftet werden. Dabei soll je ein Unterordner für ein Format angelegt werden, in dem die entsprechenden Bilder abgelegt werden können.

Zusätzlich gibt es optional die Möglichkeit, kommentierte Code-Fragmente zu nutzen, um zusätzlich ein Bild als Watermark zu nutzen.

Voraussetzungen prüfen

Zuerst wird überprüft, ob imagemagick installiert ist und ausfindig gemacht, wo sich dessen Kommandos composite und convert befinden (also ob das Setup soweit vorhanden ist). Anschließend wird geprüft, um welches Betriebssystem es sich handelt. Das ist nötig, um DIR_SCRIPT, der Dateipfad zum Skript, und DIR_SRCIMG, den Dateipfad zum Zielordner, korrekt bestimmen zu können. Es muss außerdem überprüft werden, ob alle benötigten Ordner existieren; ansonsten werden Zugriffe auf nicht existierende Dateien getätigt. Zusätzlich werden die Dateipfade ausgegeben, sodass diese nachvollzogen werden können.

_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) # does sometimes not work :-(
#DIR_WATERMARK_IMAGES="$DIR_SCRIPT/watermark-images"

echo "DIR_BASE:   $DIR_BASE"
echo "DIR_SRCIMG: $DIR_SRCIMG"
echo "DIR_SCRIPT: $DIR_SCRIPT"
#echo "DIR_WATERMARK_IMAGES: $DIR_WATERMARK_IMAGES"

function check_DIR {
  DIR=$1
  if [ ! -d "$DIR" ]; then
    echo "Error: Directory ${DIR} not found --> EXIT."
    exit 1
  fi
}

# check if all needed DIR exist
check_DIR "$DIR_SCRIPT"
check_DIR "$DIR_SRCIMG"
#check_DIR "$DIR_WATERMARK_IMAGES"
check_DIR "$DIR_BASE"

Bildgrößen bestimmen

Entsprechend der bereits oben beschriebenen Formate werden nun ein paar Integer-Variablen deklariert, die der Menge an Pixeln entspricht.

sizeSquare=1080
widthLandscape=1200
heightLandscape=628
widthPortrait=$sizeSquare
heightPortrait=1350
widthStory=$sizeSquare
heightStory=1920

Unterordner für Bilder erstellen

Als nächstes werden Variablen für die Pfade der Unterordner für die Bilder abhängig von dem beim Aufruf des Skripts übergebenen Pfad des Zielordners. Es wird geprüft, ob diese Ordner schon existieren; wenn ja, dann wird deren Inhalt überschrieben; wenn nicht, dann werden diese neu erstellt. Die Namen der Unterordner enthalten dabei zusätzlich das Format und die Größe der Bilder darin.

function check_and_create_DIR {
  DIR=$1
  if [ -d "$DIR" ]; then
    echo "${DIR} exists -> OK"
  else
    mkdir "$DIR"
    echo "Error: ${DIR} not found. Creating."
  fi
  # check if it worked
  if [ ! -d "$DIR" ]; then
    echo "Error: ${DIR} CAN NOT CREATE --> EXIT."
    exit 1
  fi
}

DIR_WATERMARK=$DIR_SRCIMG"/watermarked"

DIR_WATERMARK_ORIGINALS=$DIR_WATERMARK"-originals"
DIR_WATERMARK_SQUARE=$DIR_WATERMARK"-square-"$sizeSquare"px-"$sizeSquare"px"
DIR_WATERMARK_LANDSCAPE=$DIR_WATERMARK"-landscape-"$widthLandscape"px-"$heightLandscape"px"
DIR_WATERMARK_PORTRAIT=$DIR_WATERMARK"-portrait-"$widthPortrait"px-"$heightPortrait"px"
DIR_WATERMARK_STORY=$DIR_WATERMARK"-story-"$widthStory"px-"$heightStory"px"

check_and_create_DIR "$DIR_WATERMARK_ORIGINALS"
check_and_create_DIR "$DIR_WATERMARK_SQUARE"
check_and_create_DIR "$DIR_WATERMARK_LANDSCAPE"
check_and_create_DIR "$DIR_WATERMARK_PORTRAIT"
check_and_create_DIR "$DIR_WATERMARK_STORY"

Bilder skalieren und beschriften

Dafür muss zunächst in den Zielordner navigiert werden. Aus Gründen der Nachvollziehbarkeit kann der Pfad hier nochmal ausgegeben werden. Außerdem wird ein Zähler initialisiert, der lediglich der schönen Ausgabe des Fortschritts dient.

cd "$DIR_SRCIMG" || exit 1
echo "DIR_SRCIMG $DIR_SRCIMG"

COUNTER=1

Der Ordner wird mit einer for-Schleife durchlaufen, wobei jedes Bild mit einer der gegebenen Dateienden bearbeitet wird.

Hier wird der Fortschritt des Skripts in Form der aktuellen Zahl des Zähler zusammen mit dem Dateinamen bzw. filename (kurz FN) für den Nutzer ausgegeben.

for FN in *.jpg *.jpeg *.JPG *.JPEG *.HEIC *.heic *.png *.PNG *.tiff *.TIFF *.raw *.RAW *.RW2; do
  echo "$COUNTER PROCESSING: >$FN<"
  ((COUNTER++))

Anschließend wird der ursprüngliche Dateiname FN von seiner Dateiendunge befreit in FN_CUT gespeichert, sodass damit alle Dateipfade der Zieldateien dieses einen Bildes gebaut werden können. Dafür werden die Dateipfade aus den vorher definierten Zielordnern DIR_WATERMARK_ORIGINALS, DIR_WATERMARK_SQUARE, DIR_WATERMARK_LANDSCAPE, DIR_WATERMARK_PORTRAIT und DIR_WATERMARK_STORY, zusammen mit dem gekürzten Dateinamen FN_CUT und der Größe der Bilder in px angegeben.

FN_CUT="${FN%.*}"
  FN_ORIGINALS=$DIR_WATERMARK_ORIGINALS/$FN_CUT".jpg"
  FN_SQUARE=$DIR_WATERMARK_SQUARE/$FN_CUT"-"$sizeSquare"px-"$sizeSquare"px.jpg"
  FN_LANDSCAPE=$DIR_WATERMARK_LANDSCAPE/$FN_CUT"-"$widthLandscape"px-"$heightLandscape"px.jpg"
  FN_PORTRAIT=$DIR_WATERMARK_PORTRAIT/$FN_CUT"-"$widthPortrait"px-"$heightPortrait"px.jpg"
  FN_STORY=$DIR_WATERMARK_STORY/$FN_CUT"-"$widthStory"px-"$heightStory"px.jpg"

Als nächstes werden alle Parameter für das Wasserzeichen gesetzt. Also, die Größe, die Position, der Text und die Farbe. Dabei kann die Position entweder statisch (also z.B. immer 30px vom Rand entfernt), oder aber dynamisch zur Größe des Bildes (also z.B. immer auf 1/150 der Breite) gesetzt werden. Dasselbe gilt für die Schriftgröße (also z.B. 1/70 der Breite, oder eben 25pt).

WIDTH=$(identify -ping -format '%w' "$FN")
HEIGHT=$(identify -ping -format '%h' "$FN")
# LABELLING_SIZE=$(($WIDTH / 150)) # dynamic
LABELLING_SIZE=35 # static
# OFFSET_WATERMARK_X=$(($WIDTH / 70)) # dynamic
OFFSET_WATERMARK_X=30 # static
# OFFSET_WATERMARK_Y=0 + LABELLING_SIZE
OFFSET_WATERMARK_Y=30 # static
LABELLING_TEXT="Watermark Text"
TEXTCOLOR="#FFFFFF"

Zuletzt werden alle Kommandos zur Konvertierung angehängt. Dabei muss jede Konvertierung einzeln behandelt werden, da ja das bearbeitete Bild immer unter einem anderen Namen je ein Mal in jedem Unterordner liegen soll. Dabei handelt es sich sozusagen immer um ein Set aus zwei Kommandos pro Bearbeitung. Im ersten Zug wird die Größe des Bildes angepasst und das bearbeitete Ergebnis in den für das entsprechende Format angelegten Unterordner abgelegt; im zweiten Zug wird dasselbe Bild nochmals aus dem Unterordner entnommen, beschriftet und unter demselben Namen wieder dort abgelegt – das skalierte Bild aus Schritt Eins wird also mit der beschrifteten Datei überschrieben.

Allgemein sehen diese Kommandos aus wie folgt:

CMD="convert /source_folder/filename -resize width_in_px x height_in_px ^ -strip -gravity center -extent width_in_px x height_in_px -quality quality_as_int destination_filename "

eval "$CMD"
CMD="convert -font helvetica -fill color_in_hex -pointsize pointsize_as_int -gravity SouthEast -annotate +offset_horizontal+offset_vertical labeling_text source_filename destination_filename "

eval "$CMD"

Diese Kommandos werden entsprechend mit den dafür vorgesehenen Variablen gefüllt. Außerdem müssen je für beschriftete Originale und Instagram-Bildtyp einmal ausgeführt werden. Daher ergeben sich folgende Zeilen zur Ausführung der Skalierung und Beschriftung. So ergeben sich 5 Sets bestehend aus je diesen 2 Kommandos und deren Ausführung.

CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$WIDTH\"x\"$HEIGHT\"^ -strip -gravity center -extent \"$WIDTH\"x\"$HEIGHT\" -quality $QUALITYJPG  \"$FN_ORIGINALS\" "
eval "$CMD"
CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $(($LABELLING_SIZE * 2)) -gravity SouthEast -annotate +"$(($OFFSET_WATERMARK_X * 3))"+$(($OFFSET_WATERMARK_Y * 3)) \"${LABELLING_TEXT}\" \"$FN_ORIGINALS\" \"$FN_ORIGINALS\" "
eval "$CMD"

CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$sizeSquare\"x\"$sizeSquare\"^ -strip -gravity center -extent \"$sizeSquare\"x\"$sizeSquare\" -quality $QUALITYJPG  \"$FN_SQUARE\" "
eval "$CMD"
CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_SQUARE\" \"$FN_SQUARE\" "
eval "$CMD"

CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$widthLandscape\"x\"$heightLandscape\"^ -strip -gravity center -extent \"$widthLandscape\"x\"$heightLandscape\" -quality $QUALITYJPG  \"$FN_LANDSCAPE\" "
eval "$CMD"
CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_LANDSCAPE\" \"$FN_LANDSCAPE\" "
eval "$CMD"

CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$widthPortrait\"x\"$heightPortrait\"^ -strip -gravity center -extent \"$widthPortrait\"x\"$heightPortrait\" -quality $QUALITYJPG  \"$FN_PORTRAIT\" "
eval "$CMD"
CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_PORTRAIT\" \"$FN_PORTRAIT\" "
eval "$CMD"

CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$widthStory\"x\"$heightStory\"\> -strip -quality $QUALITYJPG  \"$FN_STORY\" "
eval "$CMD"
CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_STORY\" \"$FN_STORY\" "
eval "$CMD"

Die vollständige for-Schleife zur Skalierung und Beschriftung jedes Bildes eines Ordners zu einem beschrifteten Original, sowie den Instagram-Formaten Square, Landscape, Porträt und Story.

COUNTER=1
cd "$DIR_SRCIMG" || exit 1
echo "DIR_SRCIMG $DIR_SRCIMG"
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_ORIGINALS=$DIR_WATERMARK_ORIGINALS/$FN_CUT".jpg"
  FN_SQUARE=$DIR_WATERMARK_SQUARE/$FN_CUT"-"$sizeSquare"px-"$sizeSquare"px.jpg"
  FN_LANDSCAPE=$DIR_WATERMARK_LANDSCAPE/$FN_CUT"-"$widthLandscape"px-"$heightLandscape"px.jpg"
  FN_PORTRAIT=$DIR_WATERMARK_PORTRAIT/$FN_CUT"-"$widthPortrait"px-"$heightPortrait"px.jpg"
  FN_STORY=$DIR_WATERMARK_STORY/$FN_CUT"-"$widthStory"px-"$heightStory"px.jpg"

  WIDTH=$(identify -ping -format '%w' "$FN")
  HEIGHT=$(identify -ping -format '%h' "$FN")
  # LABELLING_SIZE=$(($WIDTH / 150)) # dynamic
  LABELLING_SIZE=35 # static
  # OFFSET_WATERMARK_X=$(($WIDTH / 70)) # dynamic
  OFFSET_WATERMARK_X=30 # static
  # OFFSET_WATERMARK_Y=0 + LABELLING_SIZE
  OFFSET_WATERMARK_Y=30 # static
  LABELLING_TEXT="Watermark Text"
  TEXTCOLOR="#FFFFFF"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$WIDTH\"x\"$HEIGHT\"^ -strip -gravity center -extent \"$WIDTH\"x\"$HEIGHT\" -quality $QUALITYJPG  \"$FN_ORIGINALS\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $(($LABELLING_SIZE * 2)) -gravity SouthEast -annotate +"$(($OFFSET_WATERMARK_X * 3))"+$(($OFFSET_WATERMARK_Y * 3)) \"${LABELLING_TEXT}\" \"$FN_ORIGINALS\" \"$FN_ORIGINALS\" "
  eval "$CMD"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$sizeSquare\"x\"$sizeSquare\"^ -strip -gravity center -extent \"$sizeSquare\"x\"$sizeSquare\" -quality $QUALITYJPG  \"$FN_SQUARE\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_SQUARE\" \"$FN_SQUARE\" "
  eval "$CMD"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$widthLandscape\"x\"$heightLandscape\"^ -strip -gravity center -extent \"$widthLandscape\"x\"$heightLandscape\" -quality $QUALITYJPG  \"$FN_LANDSCAPE\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_LANDSCAPE\" \"$FN_LANDSCAPE\" "
  eval "$CMD"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$widthPortrait\"x\"$heightPortrait\"^ -strip -gravity center -extent \"$widthPortrait\"x\"$heightPortrait\" -quality $QUALITYJPG  \"$FN_PORTRAIT\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_PORTRAIT\" \"$FN_PORTRAIT\" "
  eval "$CMD"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$widthStory\"x\"$heightStory\"\> -strip -quality $QUALITYJPG  \"$FN_STORY\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_STORY\" \"$FN_STORY\" "
  eval "$CMD"

  #CMD="$COMPOSITE -gravity SouthWest -geometry +"$OFFSET_WATERMARK_X"+"$OFFSET_WATERMARK_Y" $TRANSPARENZ \( \"$WATERMARK_IMAGE\"  \) \"$FN_SQUARE\" \"$FN_SQUARE\" "
  #eval "$CMD"

done

Runtime ausgeben und Ausführung beenden

Zu guter Letzt kann nach der Bildbearbeitung noch die Runtime, also die Zeit (in Sekunden), die das Skript für die Bearbeitung aller Bilddateien benötigt hat, ausgegeben und in eine .txt-Datei geschrieben werden. Dafür kann zu Beginn des Skripts (also irgendwo ganz oben) eine Variable before mit der aktuellen Zeit deklariert werden, mit der dann die Differenz zwischen den Zeitstempeln zu Beginn und am Ende der Ausführung des Skripts berechnet werden kann. Danach kann die Ausführung des Skripts beendet werden.

after=$(date +%s)
runtime=$((after - before))
RT="elapsed time: $runtime seconds"
echo "$RT"
echo "$RT" >script_execution_time.txt

exit

Der vollständige Code

#! /bin/bash

# 2023-07 Code by ramona.gloetter.de

# Setup on Mac:
# brew install coreutils
# brew install imagemagick
# brew install guetzli

# Setup on Windows:
# choco install gnuwin32-coreutils.install
# choco install imagemagick
# choco install guetzli

# for inserting watermarks create a folder "watermark-images" and uncomment provided watermark code

_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) # does sometimes not work :-(
#DIR_WATERMARK_IMAGES="$DIR_SCRIPT/watermark-images"

echo "DIR_BASE:   $DIR_BASE"
echo "DIR_SRCIMG: $DIR_SRCIMG"
echo "DIR_SCRIPT: $DIR_SCRIPT"
#echo "DIR_WATERMARK_IMAGES: $DIR_WATERMARK_IMAGES"

# functions
function check_DIR {
  DIR=$1
  if [ ! -d "$DIR" ]; then
    echo "Error: Directory ${DIR} not found --> EXIT."
    exit 1
  fi
}

function check_and_create_DIR {
  DIR=$1
  if [ -d "$DIR" ]; then
    echo "${DIR} exists -> OK"
  else
    mkdir "$DIR"
    echo "Error: ${DIR} not found. Creating."
  fi
  # check if it worked
  if [ ! -d "$DIR" ]; then
    echo "Error: ${DIR} CAN NOT CREATE --> EXIT."
    exit 1
  fi
}

function check_files_existance {
  FN=$1
  if [ ! -f "$FN" ]; then
    echo "Error: $FN NOT FOUND --> EXIT."
    exit 1
  fi
}

# check if all needed DIR exist
check_DIR "$DIR_SCRIPT"
check_DIR "$DIR_SRCIMG"
#check_DIR "$DIR_WATERMARK_IMAGES"
check_DIR "$DIR_BASE"

#WATERMARK_IMAGE="$DIR_WATERMARK_IMAGES/gloetter_de_wasserzeichen_1600px.png"
#echo "WATERMARK_IMAGE = $WATERMARK_IMAGE"

# Resolutions to generate

# Instagram Maße:
# quadratische Posts 1:1 = 1080 px x 1080 px
# Querformat 1,91:1 = 1200 px x 628 px
# Hochformat 4:5 = 1080 px x 1350 px
# Story 9:16 = 1080 px bis 1920 px

sizeSquare=1080
widthLandscape=1200
heightLandscape=628
widthPortrait=$sizeSquare
heightPortrait=1350
widthStory=$sizeSquare
heightStory=1920

# create subfolders for images
DIR_WATERMARK=$DIR_SRCIMG"/watermarked"

DIR_WATERMARK_ORIGINALS=$DIR_WATERMARK"-originals"
DIR_WATERMARK_SQUARE=$DIR_WATERMARK"-square-"$sizeSquare"px-"$sizeSquare"px"
DIR_WATERMARK_LANDSCAPE=$DIR_WATERMARK"-landscape-"$widthLandscape"px-"$heightLandscape"px"
DIR_WATERMARK_PORTRAIT=$DIR_WATERMARK"-portrait-"$widthPortrait"px-"$heightPortrait"px"
DIR_WATERMARK_STORY=$DIR_WATERMARK"-story-"$widthStory"px-"$heightStory"px"

check_and_create_DIR "$DIR_WATERMARK_ORIGINALS"
check_and_create_DIR "$DIR_WATERMARK_SQUARE"
check_and_create_DIR "$DIR_WATERMARK_LANDSCAPE"
check_and_create_DIR "$DIR_WATERMARK_PORTRAIT"
check_and_create_DIR "$DIR_WATERMARK_STORY"
#check_files_existance "$WATERMARK_IMAGE"

cd "$DIR_BASE" || exit 1

# Watermark images
before=$(date +%s) # get timing
COUNTER=1
cd "$DIR_SRCIMG" || exit 1
echo "DIR_SRCIMG $DIR_SRCIMG"
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_ORIGINALS=$DIR_WATERMARK_ORIGINALS/$FN_CUT".jpg"
  FN_SQUARE=$DIR_WATERMARK_SQUARE/$FN_CUT"-"$sizeSquare"px-"$sizeSquare"px.jpg"
  FN_LANDSCAPE=$DIR_WATERMARK_LANDSCAPE/$FN_CUT"-"$widthLandscape"px-"$heightLandscape"px.jpg"
  FN_PORTRAIT=$DIR_WATERMARK_PORTRAIT/$FN_CUT"-"$widthPortrait"px-"$heightPortrait"px.jpg"
  FN_STORY=$DIR_WATERMARK_STORY/$FN_CUT"-"$widthStory"px-"$heightStory"px.jpg"

  WIDTH=$(identify -ping -format '%w' "$FN")
  HEIGHT=$(identify -ping -format '%h' "$FN")
  # LABELLING_SIZE=$(($WIDTH / 150)) # dynamic
  LABELLING_SIZE=35 # static
  # OFFSET_WATERMARK_X=$(($WIDTH / 70)) # dynamic
  OFFSET_WATERMARK_X=30 # static
  # OFFSET_WATERMARK_Y=0 + LABELLING_SIZE
  OFFSET_WATERMARK_Y=30 # static
  LABELLING_TEXT="Watermark Text"
  TEXTCOLOR="#FFFFFF"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$WIDTH\"x\"$HEIGHT\"^ -strip -gravity center -extent \"$WIDTH\"x\"$HEIGHT\" -quality $QUALITYJPG  \"$FN_ORIGINALS\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $(($LABELLING_SIZE * 2)) -gravity SouthEast -annotate +"$(($OFFSET_WATERMARK_X * 3))"+$(($OFFSET_WATERMARK_Y * 3)) \"${LABELLING_TEXT}\" \"$FN_ORIGINALS\" \"$FN_ORIGINALS\" "
  eval "$CMD"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$sizeSquare\"x\"$sizeSquare\"^ -strip -gravity center -extent \"$sizeSquare\"x\"$sizeSquare\" -quality $QUALITYJPG  \"$FN_SQUARE\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_SQUARE\" \"$FN_SQUARE\" "
  eval "$CMD"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$widthLandscape\"x\"$heightLandscape\"^ -strip -gravity center -extent \"$widthLandscape\"x\"$heightLandscape\" -quality $QUALITYJPG  \"$FN_LANDSCAPE\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_LANDSCAPE\" \"$FN_LANDSCAPE\" "
  eval "$CMD"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$widthPortrait\"x\"$heightPortrait\"^ -strip -gravity center -extent \"$widthPortrait\"x\"$heightPortrait\" -quality $QUALITYJPG  \"$FN_PORTRAIT\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_PORTRAIT\" \"$FN_PORTRAIT\" "
  eval "$CMD"

  CMD="$CONVERT \"$DIR_SRCIMG/$FN\" -resize \"$widthStory\"x\"$heightStory\"\> -strip -quality $QUALITYJPG  \"$FN_STORY\" "
  eval "$CMD"
  CMD="$CONVERT -font helvetica -fill \"$TEXTCOLOR\" -pointsize $LABELLING_SIZE -gravity SouthEast -annotate +"$OFFSET_WATERMARK_X"+$(($OFFSET_WATERMARK_Y)) \"${LABELLING_TEXT}\" \"$FN_STORY\" \"$FN_STORY\" "
  eval "$CMD"

  #CMD="$COMPOSITE -gravity SouthWest -geometry +"$OFFSET_WATERMARK_X"+"$OFFSET_WATERMARK_Y" $TRANSPARENZ \( \"$WATERMARK_IMAGE\"  \) \"$FN_SQUARE\" \"$FN_SQUARE\" "
  #eval "$CMD"

done

after=$(date +%s)
runtime=$((after - before))
RT="elapsed time: $runtime seconds"
echo "$RT"
echo "$RT" >script_execution_time.txt

exit
22330cookie-checkInstagram image auto resize and watermark script

Leave a Reply

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