Bilderrahmen mit ImageMagick

Send to Kindle
Bild mit automatischem Rahmen

Bild mit automatischem Rahmen

Am vergangenen Dienstag, den 27.01.2015, war wieder einmal Vereinsabend der Fotografischen Gesellschaft Osnabrück. Mein Foto-Freund Carsten stellte das Lightroom-Plugin Mogrify vor. Damit kann man nette Bilderrahmen erstellen, die dann auch EXIF-Informationen einblenden usw.

Unter Linux ist es ja Essig mit Lightroom, so dass auch das Plugin nicht eingesetzt werden kann. Aber: Das gute Stück setzt auf ImageMagick auf! – ImageMagick ist natürlich unter Linux verfügbar. Also dachte ich mir, ich bastele mir ein kleines Skript, mit dem ich meine fertig bearbeiteten Bilder, ähnlich Mogrify, mit Rahmen und EXIF-Informationen versehe, und so viele Bilder automatisiert für das Web aufbereiten kann. Kurz: Eine Automatisierung meines Web-Workflows.

Was soll das Skript leisten?

  • große Bilder verkleinern, kleine Bilder bleiben unberührt von Größenänderungen,
  • einen dünnen schwarzen Rand um das Foto zeichnen,
  • ein weißes Passepartout erzeugen und
  • die Bildinformation am unteren Rand platzieren

Gesagt, getan – hier ist das Skript:

#!/bin/bash
#
# myframe.sh - Shell-Skript zur Web-Aufbereitung von Fotos
#
#              Mit
#                     for i in *.jpg; do myframe.sh $i; done
#
#              kann man gleich viele Dateien mit Rahmen versehen.
#
#              ... noch etwas quick & dirty, aber hoffnungsvoll...
#
# Karsten Brodmann, 2015-01-28
# Gebrauchsanweisung
if [ $# != 1 ] ; then
echo "Aufruf: myframe.sh foto.jpg "
echo "foto.jpg -> Dateiname des zu bearbeitenden Fotos"
exit 1
fi
# Prüfe, ob Datei auch vorhanden und lesbar
if ! test -r $1 ; then
echo "Datei kann nicht gelesen werden: $1"
exit 2
fi
# ... ok, die Datei existiert und kann gelesen werden,
#     also an die Arbeit ...
# EXIF-Informationen auslesen
#
# Hinweis: exiftool -a -G1 -s foto.jpg >exif.txt
#
#     zeigt alle verfügbaren Tags aus foto.jpg an und speichert sie in exif.txt,
#     wo man sie bequem nachlesen kann.
ZEIT=$(exiftool -s3 -ExposureTime $1)        # Belichtungszeit
ISO=$(exiftool -s3 -ISO $1)                  # ISO
BLENDE=$(exiftool -s3 -FNumber $1)           # Blende
AUTOR=$(exiftool -s3 -Artist $1)             # Bildautor
DATUM=$(exiftool -s3 -CreateDate $1)         # Aufnahmedatum
#
# Sonderlocke ...
# ... für Fotos, die mit GIMP 2.8.14 bearbeitet wurden. Scheinbar
# verschiebt GIMP den Inhalt des Title-Tags nach ImageDescription. In der
# von mir getesteten Entwicklerversion 2.9.1 ist der Fehler korrigiert.
#
TITEL=$(exiftool -s3 -Title $1)              # Titel des Bildes
if [ "${TITEL}" == "x-default" ]; then
TITEL=$(exiftool -s3 -ImageDescription $1) # (Ersatz)Titel des Bildes
fi
# Sonderlocke-Ende
#
KAMERA=$(exiftool -s3 -Model $1)             # Kameramodell
OBJEKTIV=$(exiftool -s3 -Lens $1)            # Objektiv(kurz)bezeichnung / LensID = Langbezeichnung
# Basis-Dateinahmen ermitteln
if [ "." != ${1: -4:1} ] ; then
DATEINAME=$1
else
DATEINAME=${1%%${1: -4}}
fi
#
# Konvertierung (hier kann man kreativ sein)
#
# Hinweis:
#    a) große Bilder werden verkleinert, so dass sie bei den angegebenen Rahmengrößen max. 1920x1080 Pixel messen
#    b) es wird ein weißer Rahmen generiert, der unter breiter ist (für Bilddaten)
#    c) schwarze Umrandung des eigentlichen Fotos
#    d) "dekorative" Einblendung der EXIF-Daten
#
#    Die auf dem System verfügbaren Schriften kann man wie folgt anzeigen und in Datei speichern:
#
#       convert -list font >fonts.txt
#
#    ACHTUNG: Nicht jede Schriftart unterstützt deutsche Umlaute!
#
convert -resize 1850x990\> \
-bordercolor Black -border 5x5 \
-bordercolor White -border 30x30  \
-gravity South -background white -splice 0x20 \
-gravity SouthWest -font Helvetica -pointsize 12 -annotate +30+11 "${KAMERA}, ${OBJEKTIV}\nf/${BLENDE} ${ZEIT} ${ISO} ISO" \
-gravity South -font TeX-Gyre-Heros-Bold -pointsize 27 -annotate +0+7 "${TITEL}" \
-gravity SouthEast -font Helvetica -pointsize 12 -annotate +30+23 "${AUTOR}, ${DATUM:0:4}" \
$1 ${DATEINAME}_mit_rahmen.jpg

Ok, es ist derzeit noch etwas quick & dirty implementiert. Das kann aber leicht aufpoliert werden. Dennoch kann man seinen Workflow schon effizient automatisieren. Wichtig ist aber vor allem die Erkenntnis, dass es wirklich einfach ist, sich ein solches Skript zu bauen. Ich habe Rahmen einfach von innen nach außen aufbebaut. Am unteren Rand, den ich breiter haben wollte, um die Bildunterschriften besser platzieren zu können, habe ich ein Stück angeflickt. Die EXIF-Informationen habe ich exiftool extrahiert. Die Hauptarbeit leistet convert in nur einem Befehl.

Bei Vorhandensein der genutzten Programme, läuft das Skript auch unter Mac OS X. Ich habe es getestet.

Für mehrere Bilder lässt sich das Skript einfach in einer Schleife aufrufen:

for i in *.jpg; do myframe.sh $i; done

Und so sieht das dann im Ergebnis aus:

Das Skript ist momentan nur als ein erster Versuch in dieser Richtung zu betrachten. Da ist noch viel zu verbessern, um beispielsweise die Flexibilität zu erhöhen. Ich könnte mir vorstellen, verschiedene Rahmenvorlagen als separate Dateien zu speichern, die man dann via Parameter übergibt und so verschiedenste Rahmen erzeugen kann. Auch sollte die Größe der Bilder nicht grundsätzlich limitiert werden. Vorstellbar wäre, die Größe als Parameter an das Skript zu übergeben und dann auch Drucke damit aufzubereiten. Dann muss natürlich ein wenig gerechnet werden, weil die Randabmessungen dann nicht als Konstanten vorgegeben sein dürfen. Nun ja, da kann sich jeder selbst züchtigen und auslassen.

Ich, für meinen Teil, werde das Skript ausbauen, um damit meine Belange automatisiert erfüllen zu können. – Viel Spaß!