~~NOTOC~~ ====== JPEG-Bilder anpassen, rotieren, EXIF-Daten modifizieren ====== Das JPEG-Format erfreut sich seit Jahrzehnten großer Beliebtheit für Bilder und ist nach wie vor das Standard-Format für Fotos im Internet. Da man auf Webseiten aber nicht unbedingt immer die Bilder in voller Auflösung hinterlegen möchte (z.B. in einem Blog), stellt sich schnell die Frage nach Werkzeugen, um einen ganzen Stapel an Bildern automatisiert zu verarbeiten. Darüber hinaus ist es manchmal notwendig oder gewünscht, die Metadaten (EXIF etc.) in Bildern zu verändern, insbesondere dann, wenn in den EXIF-Daten die Orientierung des Bildes nach einer Drehung nicht aktualisiert wurde, was manchen Webbrowser (z.B. Safari) zu interessantem Verhalten führt. Wie so oft gibt es eine ganze Reihe kleiner Kommandozeilenwerkzeuge aus der Linux-Welt dazu. ===== Das JPEG-Format ist verlustbehaftet ===== Gleich ein wichtiger Hinweis vorweg: Das JPEG-Format ist verlustbehaftet. Das bedeutet aber auch, dass jede Umkodierung (also neue Speicherung) in diesem Format zu einem (zumindest geringen) Verlust der Bildqualität führt. Deshalb ist es //nicht// ratsam, für die reine Rotierung eines Bildes um (Vielfache von) 90 Grad Programme (wie ImageMagick) zu verwenden, die das Bild komplett neu schreiben. Hierbei ist es auch völlig egal, ob man ein Programm mit grafischer Nutzeroberfläche oder eines auf der Kommandozeile verwendet. Wird das Bild komplett neu geschrieben, geht das immer mit einem Qualitätsverlust einher. ===== Zielstellung: Automatisierung ===== Die Idee hinter allem, was nachfolgend in diesem Beitrag beschrieben wird, ist die weitgehende Automatisierung von Routineaufgaben. Das lässt sich auf der Kommandozeile (Terminal) wesentlich flexibler erreichen als mit komplexen Programmen mit grafischer Bedienoberfläche. Getestet wurde teils unter macOS, teils unter Linux. ===== ImageMagick: das „Schweizer Taschenmesser“ ===== [[https://imagemagick.org/|ImageMagick]] ist ein freies Programm, das für viele Betriebssysteme verfügbar ist und auf der Kommandozeile auch komplexe Bildverarbeitung erlaubt. Es eignet sich sehr gut für die automatisierte Verarbeitung vieler Bilder. Bei der Verarbeitung von JPEG-Bildern gilt: Jedes Neucodieren und Speichern ist verlustbehaftet, deshalb sollten nach Möglichkeit alle Verarbeitungsschritte auf einmal erfolgen. Um nur die Ausrichtung eines JPEG-Bildes zu verändern, ist ImageMagick sicherlich nicht das beste Werkzeug. Am Ende des Beitrags gibt es ein kleines Bash-Skript, das dafür genutzt werden kann, Bilder zu verkleinern und automatisch zu drehen, so dass sie auf einer Webseite (z.B. einem Blog) verwendet werden können. ===== Verlustfreie Rotation: exiftran ===== Wie schon mehrfach erwähnt: Jedes Programm, das eine JPEG-Datei neu schreibt, nur weil es sie dreht, sorgt für (vermeidbare) Verluste der Bildqualität. Deshalb sollte man, wenn es nur um die Rotation geht, Programme verwenden, die auch JPEG-Dateien verlustfrei bearbeiten können. Ein solches Programm ist [[https://www.kraxel.org/blog/linux/fbida/|exiftran]], das zumindest für Debian-basierte Linux-Distributionen aus den Paketquellen und auf macOS über [[https://brew.sh/|Homebrew]] installiert werden kann. Die [[https://linux.die.net/man/1/exiftran|Hilfeseite]] bietet einen ersten Eindruck der Nutzung. Im Wesentlichen kann man, wenn man weiß, was man tut, die Bilder //in place// modifizieren lassen: exiftran -ai *jpg Natürlich empfiehlt es sich immer, sowas vorher auszuprobieren und sich sicher zu sein, was man tut. Ansonsten sollte es sowieso immer ein Backup der Bilder geben... ===== Werkzeuge zur Metadatenbearbeitung: Exiv2 ===== Manchmal gibt es Fälle, wo die Orientierung, die in den EXIF-Daten steht, einfach nicht mit der Orientierung des Bildes übereinstimmt. Das wäre ein Fall, in dem man EXIF-Daten gerne änderte. Natürlich lassen sich auch viele weitere gute Beispiele finden, warum man Metadaten ändern wollte. Ein Beispiel aus eigener Erfahrung: Der Safari-Webbrowser zeigt ein Bild falsch orientiert an, andere Browser zeigen es korrekt an, und die verlustfreie Rotation über exiftran (s.o.) liefert keine vernünftigen Ergebnisse. Hier war das Problem, dass die EXIF-Daten zur Orientierung nicht mit der realen Orientierung des Bildes übereinstimmten, vermutlich ein Programm also das Bild gedreht hatte, ohne die EXIF-Daten anzupassen. Hier hilft ein Werkzeug zur Bearbeitung der Metadaten (EXIF; IPTC, XMP) wie [[https://www.exiv2.org/|Exiv2]]. Auch dieses Werkzeug ist zumindest für Debian-basierte Linux-Distributionen aus den Paketquellen und für macOS via [[https://brew.sh/|HomeBrew]] installierbar. Das Werkzeug ist sicherlich nicht das, was Menschen ohne Erfahrung mit der Kommandozeile gerne nutzen wollen, aber mit ein bisschen Eingewöhnung sehr hilfreich. Alle Metadaten eines Bildes lassen sich mit dem folgenden Befehl ausgeben: exiv2 -pt .jpg Hier werden die Schlüssel und Werte menschenlesbar übersetzt, die Option ``-pv`` gibt die reinen Schlüssel und Werte aus, was mitunter hilfreich sein kann, wenn man für die Werte den gesetzten Wert und nicht seine menschenlesbare Übersetzung benötigt. Möchte man ausschließlich die Orientierung aus den EXIF-Daten für ein Bild erfragen, ließe sich das z.B. wie folgt bewerkstelligen: exiv2 -pt .jpg |grep 'Orientation' Nun zur Sache: Ein Bild ist bereits rotiert, allerdings behaupten die EXIF-Daten etwas anderes. Entsprechend sollen die EXIF-Daten gesetzt werden. Die Orientierung ist als [[http://sylvana.net/jpegcrop/exif_orientation.html|ganzzahliger Wert in den EXIF-Daten abgelegt]]. Eine "1" entspricht der Angabe, das Bild //nicht// zu rotieren. Entsprechend lautete der Befehl zum Setzen der EXIF-Daten: exiv2 -M"set Exif.Image.Orientation Short 1" .jpg Der Befehl setzt die Orientierung, mit "Short" wird der Typ der Variablen angegeben, und die "1" ist die Orientierung (entspricht keiner Drehung). Weitere Beispiele finden sich auf der [[https://www.exiv2.org/sample.html#modify|Webseite von Exiv2]]. Natürlich bietet sich auch hier einmal mehr an, das an einer Kopie des eigentlichen Bildes zu probieren, wenn man sich seiner Sache nicht ganz sicher ist. ===== Anwendungsfall: automatisch rotieren und verkleinern ===== In diesem Fall werden alle Bilder mit der Endung "jpg" im aktuellen Verzeichnis auf eine Größe von maximal 800 Pixeln (die längere Kante) reduziert und das Ergebnis in ein konfigurierbares Verzeichnis (hier: ''klein'') geschrieben. Außerdem wird automatisch die Orientierung angepasst. #!/usr/bin/env bash # This script requires ImageMagick to be installed on your system # Set some variables OUTDIR="klein" GEOMETRY="800x800" QUALITY="92" mkdir ${OUTDIR} 2> /dev/null for img in *jpg; do convert ${img} \ -geometry ${GEOMETRY} \ -quality ${QUALITY} \ -auto-orient \ ${OUTDIR}/${img} done Auch wenn die Werte für Größe, Qualität und Ausgabeverzeichnis nicht willkürlich gewählt sind, empfiehlt es sich natürlich, das den jeweils eigenen Bedürfnissen anzupassen. Und noch ein Hinweis: Da hier die Größe verändert wird, muss das Bild sowieso neu codiert werden, was immer mit einem Qualitätsverlust verbunden ist. Deshalb ist die Änderung der Orientierung hier auch kein Problem, weil sie in einem Zug mit erledigt wird. Intern verwendet das hier genutzte ImageMagick allerdings ein anderes, verlustfreies Format, sodass erst beim Schreiben des Ergebnisses die unvermeidlichen Verluste aufgrund der JPEG-Kompression ins Spiel kommen. ===== Quellen und hilfreiche Links ===== * https://imagemagick.org/ \\ offizielle Webseite von ImageMagick * https://www.exiv2.org/ \\ offizielle Webseite von Exiv2 * https://www.kraxel.org/blog/linux/fbida/ \\ offizielle Webseite von exiftrans und weiteren Werkzeugen * https://imagemagick.org/Usage/photos/#orient \\ Hinweise zur Verwendung von ImageMagick für das Rotieren und Setzen der EXIF-Daten * https://linux.die.net/man/1/exiftran \\ exiftran man page (u.a. verlustfreie Rotation) * http://sylvana.net/jpegcrop/exif_orientation.html \\ Hinweise zu den Werten für den EXIF-Parameter für die Orientierung {{tag>fotografie bildbearbeitung exif}}