Zuletzt aktualisiert am 29. Juli 2024 von Lars
EXIF in Bild: Möchtest du gerne in deine Bilder die EXIF-Daten einblenden? In diesem Artikel zeige ich dir eine Möglichkeit auf.
So wird das Ergebnis aussehen.

Rechts unten siehst du die EXIF-Daten klein eingeblendet. Kameratyp, Verschlusszeit, Blende, ISO, Brennweite und in Klammer die Brennweite auf Vollformat gerechnet.

Inhaltsverzeichnis
Was sind EXIF-Daten?
Wenn du Fotos machst, speichert deine Kamera neben dem Bild selbst auch eine Reihe von zusätzlichen Informationen, die als EXIF-Daten bekannt sind. EXIF steht für "Exchangeable Image File Format" und umfasst Details wie Kameramodell, Datum und Uhrzeit der Aufnahme, Brennweite, Verschlusszeit, Blende und ISO-Wert. Diese Daten helfen dir nicht nur, mehr über die Bedingungen deiner Aufnahmen zu erfahren, sondern können auch nützlich sein, um deine Fotografie-Fähigkeiten zu verbessern, indem du siehst, welche Einstellungen in verschiedenen Situationen verwendet wurden.
Realisation Exif in Bild anzeigen
Von Beruf her bin ich Informatiker und die Lösung geht auch in diese Richtung. Falls du mehr dazu wissen willst, schau doch mal beim zugehörigen Blog it-zeugs.de und YouTube-Kanal vorbei.
Zugegebenermassen ist diese Umsetzung nicht ganz trivial. Es gibt sicherlich auch fertige Lösungen. Ich hatte jedoch keine gefunden, die das für mich passende Ergebnis geliefert hätte und so habe ich ein sogenanntes Shell-Script unter macOS mit der Hilfe von ChatGPT geschrieben. Das Tool läuft also so nur auf dem Apple Mac.
Siehe diesen Artikel daher bitte als Anregung, wie du dir deine eigene Lösung bauen kannst und nicht als Out-of-the-box-Lösung
Die nötige Bibliothek gibt es allerdings auch unter Windows und insofern sollte sich das durchaus auch auf Windows portieren lassen (und Linux natürlich sowieso).
Der technische Unterbau unter macOS ist ein Unix-artiges Betriebssystem. Damit lässt sich vieles skripten. Idealerweise kennt man sich mit Linux und der Shell schon etwas aus, sonst wird es kompliziert.
Was ist ImageMagick?
Für das Skript benötigen wir ImageMagick. ImageMagick ist ein mächtiges, kostenlos verfügbares Software-Tool, das speziell für die Bearbeitung und Manipulation von digitalen Bildern entwickelt wurde. Mit ImageMagick kannst du Bilder in über 200 Formaten lesen, umwandeln und bearbeiten. Ob es darum geht, Bilder zu skalieren, zu rotieren, Farben zu ändern, komplexe Transformationen durchzuführen oder Texte zu Bildern hinzuzufügen – all das und mehr ist möglich. Das Tool ist besonders bei Entwicklern und Designern beliebt, weil es sowohl über Befehlszeilen-Schnittstellen als auch über Bindungen für zahlreiche Programmiersprachen verfügt, was eine automatisierte und skriptbasierte Bildbearbeitung ermöglicht.
Installation von ImageMagick unter macOS
Ich installiere, wenn immer möglich, Software unter macOS mit der kostenlosen Paketverwaltung Homebrew.
Homebrew installiert man im Terminal mit dem Befehl.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Nachdem Homebrew installiert ist, kann man ImageMagick mit diesem Befehl installieren.
brew install imagemagick
Mit Homebrew kann man auch viele weitere Programme installieren. Updates spielt man dann einfach durch Aufruf dieser beiden Befehle ein.
brew install update
brew install upgrade
Ordner anlegen
Ich habe mir einen Ordner "/Users/lars/exif" angelegt, wobei "/Users/lars/" mein sogenannter Homeordner ist. Bei Karl wäre als "/Users/karl/exif" ein entsprechendes Verzeichnis.
Skript-Datei für EXIF in Bild anlegen
In diesem Ordner habe ich eine Datei mit dem Namen exifprint.sh angelegt.
Dieser Datei muss man dann noch Ausführungsberechtigung geben, denn diese Datei ist unser Skript. Sie wird also die Befehle enthalten, die die EXIF-Daten in das Bild schreiben wird.
Die Ausführungsberechtigung erteilen wir auf der sogenannten Shell durch Eingabe von diesem Befehl aus dem korrekten Ordner.
chmod +x ./exifprint.sh
Der Inhalt der Datei sieht so aus.
#!/bin/bash
# Überprüfen, ob ein Argument gegeben wurde
if [ "$#" -ne 1 ]; then
echo "Syntax: $0 <image_path>"
exit 1
fi
# Pfad zum Bild von Kommandozeilenargument übernehmen
image_path="$1"
# Sicherstellen, dass die Datei existiert
if [ ! -f "$image_path" ]; then
echo "Bild-Datei existiert nicht: $image_path"
exit 1
fi
# Ausgabedateiname generieren
output_path="${image_path%.*}-exif.jpg"
# EXIF-Daten extrahieren
camera=$(magick identify -format "%[EXIF:Model]" "$image_path")
focal_length_fraction=$(magick identify -format "%[EXIF:FocalLength]" "$image_path")
exposure_time_fraction=$(magick identify -format "%[EXIF:ExposureTime]" "$image_path")
f_number_fraction=$(magick identify -format "%[EXIF:FNumber]" "$image_path")
iso=$(magick identify -format "%[EXIF:PhotographicSensitivity]" "$image_path")
# Brüche in Dezimalzahlen umwandeln und unnötige Nachkommastellen entfernen
focal_length=$(echo "scale=0; $focal_length_fraction" | bc -l)
f_number=$(echo "scale=1; $f_number_fraction" | bc -l)
# Crop-Faktor festlegen basierend auf dem Kameramodell
case "$camera" in
"DSC-RX100M7")
crop_factor=2.7777
;;
"ILCE-6100")
crop_factor=1.5
;;
# Weitere Kameramodelle hier einfügen
# "Kameramodell-Name")
# crop_factor=Wert
# ;;
*)
crop_factor=1.0 # Standardwert, falls keine spezifische Kamera erkannt wird
;;
esac
full_frame_focal_length=$(echo "scale=10; $focal_length * $crop_factor" | bc -l)
full_frame_focal_length=$(echo "scale=0; ($full_frame_focal_length + 0.5)/1" | bc)
# Größe des Textes und Puffer bestimmen
text="$camera $exposure_time_fraction Sek. bei f / $f_number, ISO $iso, $focal_length mm ($full_frame_focal_length mm)"
padding=10 # Anpassen für mehr oder weniger Platz um den Text
font_size=60
text_height=$((font_size + padding))
# Bild mit annotierten Daten und erweitertem Hintergrund generieren
magick "$image_path" \
-font Arial -pointsize $font_size \
-fill white \
-undercolor '#00000040' \
-splice 0x10 \
-gravity SouthWest \
-annotate +${padding}+${padding} "$text" \
"$output_path"
echo "Datei generiert: $output_path"
Skript anwenden
Im gleichen Ordner, in dem auch das Skript liegt, lege ich die Bild-Dateien (ausschliesslich JPG) ab, die mit den EXIF-Daten versehen werden.
Angenommen, die Bild-Datei heisst 1.jpg, dann kann ich das Skript so aufrufen.
./exifprint.sh ./1.jpg
Die Syntax ./datei findet unter Unix Anwendung und bedeutet, dass ich eine Datei im aktuellen Ordner (durch den Punkt referenziert), anspreche.
Die Ausgabe lautet dann.
[PolarAirBookM1] lars :: ~/exif > ./exifprint.sh ./1.jpg
Datei generiert: ./1-exif.jpg
[PolarAirBookM1] lars :: ~/exif >
Im gleichen Ordner wird die Datei 1-exif.jpg erzeugt, die die EXIF-Daten enthält.
Das Skript erklärt
Ich erkläre hier jetzt nicht Befehl für Befehl. Zum einen würde ich damit den Rahmen des Artikels sprengen, zum anderen kenne ich nicht absolut von jedem Befehl die Bedeutung im Detail, da ich einiges auch von ChatGPT generieren lassen habe. Bei Fragen wende dich an den macOS Spezialist deiner Wahl 🙂
#!/bin/bash
# Überprüfen, ob ein Argument gegeben wurde
if [ "$#" -ne 1 ]; then
echo "Syntax: $0 <image_path>"
exit 1
fi
# Pfad zum Bild von Kommandozeilenargument übernehmen
image_path="$1"
# Sicherstellen, dass die Datei existiert
if [ ! -f "$image_path" ]; then
echo "Bild-Datei existiert nicht: $image_path"
exit 1
fi
# Ausgabedateiname generieren
output_path="${image_path%.*}-exif.jpg"
Dieser Teil definiert einmal den zu verwendenden Befehlsinterpreter (!/bin/bash) und nimmt den Dateinamen in der Variable $1 entgegen, den wir beim Aufruf übergeben haben.
Es wird überprüft, ob dieser existiert. Falls nicht, wird das Skript abgebrochen.
Schliesslich wird noch der Ausgabename generiert. Aus test.jpg würde test-exif.jpg.
# EXIF-Daten extrahieren
camera=$(magick identify -format "%[EXIF:Model]" "$image_path")
focal_length_fraction=$(magick identify -format "%[EXIF:FocalLength]" "$image_path")
exposure_time_fraction=$(magick identify -format "%[EXIF:ExposureTime]" "$image_path")
f_number_fraction=$(magick identify -format "%[EXIF:FNumber]" "$image_path")
iso=$(magick identify -format "%[EXIF:PhotographicSensitivity]" "$image_path")
# Brüche in Dezimalzahlen umwandeln und unnötige Nachkommastellen entfernen
focal_length=$(echo "scale=0; $focal_length_fraction" | bc -l)
f_number=$(echo "scale=1; $f_number_fraction" | bc -l)
Hier werden mit dem Befehl magick (aus ImageMagick) diverse EXIF-Werte ausgelesen und in Variablen eingelesen. Manche der Werte kommen als Brüche zurück und müssen daher in Dezimalzahlen umgewandelt werden.
Die Werte werden jeweils in Variablen gespeichert. Variablen erkennt man daran, dass ein Dollar-Zeichen ($) vorangestellt ist. Also $camera ist eine solche Variable.
# Crop-Faktor festlegen basierend auf dem Kameramodell
case "$camera" in
"DSC-RX100M7")
crop_factor=2.7777
;;
"ILCE-6100")
crop_factor=1.5
;;
# Weitere Kameramodelle hier einfügen
# "Kameramodell-Name")
# crop_factor=Wert
# ;;
*)
crop_factor=1.0 # Standardwert, falls keine spezifische Kamera erkannt wird
;;
esac
full_frame_focal_length=$(echo "scale=10; $focal_length * $crop_factor" | bc -l)
full_frame_focal_length=$(echo "scale=0; ($full_frame_focal_length + 0.5)/1" | bc)
Ich möchte neben der tatsächlichen optischen Brennweite die Brennweite umgerechnet auf das Vollformat in Klammer mit angeben. Hierzu brauche ich den Crop-Faktor. Diesen muss ich je Kamera vordefinieren. Dazu muss ich ausprobieren, welchen Kameranamen ich zurückbekomme und diesem den richtigen Crop-Faktor zuweisen. Die Variable heisst dann entsprechend. Hier im Beispiel habe ich nur die Sony RX100 VII (Name "DSC-RX100M7") und die Sony Alpha 6100 (Name "ILCE-6100") definiert. Hast du mehrere, musst den Code-Teil entsprechend ergänzen. Damit kann ich nun die Brennweite umgerechnet auf Vollformat berechnen (Variable full_frame_focal_length).
# Größe des Textes und Puffer bestimmen
text="$camera $exposure_time_fraction Sek. bei f / $f_number, ISO $iso, $focal_length mm ($full_frame_focal_length mm)"
padding=10 # Anpassen für mehr oder weniger Platz um den Text
font_size=60
text_height=$((font_size + padding))
Hier wird der eigentliche Ausgabetext zusammengebaut (Variable text) und ausserdem weitere Variablen für die Schriftgrösse (font_size) und mehr gesetzt.
# Bild mit annotierten Daten und erweitertem Hintergrund generieren
magick "$image_path" \
-font Arial -pointsize $font_size \
-fill white \
-undercolor '#00000040' \
-splice 0x10 \
-gravity SouthWest \
-annotate +${padding}+${padding} "$text" \
"$output_path"
echo "Datei generiert: $output_path"
Am Schluss wird dann wieder mit dem Befehl magick die Daten in das Bild geschrieben, mit den entsprechenden Optionen (z.B. grauem Hintergrund – undercolor).
Die letzte Zeile gibt dann die Erfolgsmeldung aus.
Fazit Skript um Exif in Bild anzeigen
Das Skript ist sicher nicht perfekt und wird wahrscheinlich auch den ein oder anderen Bug enthalten. Ich habe es selbst in mehreren Iterationen erstellt.
Habe bitte Verständnis, dass ich dir dein Skript nicht debuggen kann. Dieser Artikel soll dir eine Anregung für deine eigene Lösung sein und keine Out-of-the-box-Löung.
Und natürlich wie immer: Garantie gibt es keine.

Hallo, hier schreibt Lars. Ambitionierter Hobbyfotograf. Outdoor-Fan. Reisender. Informatiker. Meist unterwegs mit Kamera, Zelt oder Minicamper. Mehr über mich erfährst du hier: Über mich. Danke für deinen Besuch!