Canon-Kameras, Python-PIL und die EXIF-Daten
12. Oktober 2022 um 19:23 Uhr von Atari-Frosch
Vorgestern Abend stieß ich auf ein … interessantes Problem.
Projekt: downscaler (Git-Repo: Downscaler; clonen geht derzeit noch nicht wieder, aber man kommt über den „snapshot“-Link an die Datei-Inhalte). Geschrieben in Python3 mit den externen Modulen PIL (pillow) und piexif.
Das recht einfache Python-Script rotiert die JPG-Dateien aus einem Verzeichnis (bei Bedarf) und skaliert sie dann – sofern das Original größer ist – so herunter, daß die breitere Seite 1200 px hat. Das Ergebnis wird unter demselben Dateinamen in ein anderes Verzeichnis gespeichert. Das Original wird dabei nicht verändert. So weit, so gut.
Bisher habe ich das beim Bearbeiten mit The GIMP direkt mitgemacht. Das bedeutet aber auch, daß ich selbst solche Fotos, an denen ich sonst gar nichts editieren will, in GIMP holen, ggf. rotieren, runterskalieren und wieder abspeichern muß. Sich wiederholende Tätigkeiten sollte man doch besser einem Computer überlassen, weil der das schneller kann, nicht wahr? 🙂
In der Zieldatei sollen die EXIF-Daten erhalten bleiben. Deshalb habe ich piexif dazugenommen, weil PIL EXIF-Tags zwar auslesen und anwenden kann, sie aber dann nicht wieder mit abspeichert, warum auch immer.
Ich verwendete dafür dieses Beispiel.
Meistens klappt das in dieser Kombination dann auch – aber nicht immer. Ich habe ein wenig experimentiert und herausgefunden, daß es davon abhängt, welches Gerät die Ursprungsdateien erzeugt hat, ob die EXIF-Daten tatsächlich in die Zieldatei mit eingespeichert werden:
device | exif | logfile |
---|---|---|
Canon CanoScan 9000F Mark II | ja | ja |
Canon EOS 350D | nein | ja |
Canon EOS 750D | nein | ja |
Canon IXUS 160 | nein | ja |
Canon Powershot A2000IS | nein | ja |
Doogee X5pro | ja | ja |
Fujifilm FinePix 2400 Zoom | ja | ja |
HP PhotoSmart C30 | ja | ja |
HTC Desire | ja | ja |
Motorola 3.3 Mega Pixels DSC | ja | ja |
Nokia 2.2 | ja | meistens |
Panasonic DMC FZ20 | ja | nein |
Reflecta x7-scan | ja | ja |
Logfile: Bei den meisten Geräten werden bei Verwendung des Python-Moduls 'logging' die ganzen EXIF-Daten auch nochmal mit ins Logfile geklebt, obwohl ich das nirgendwo angegeben habe. Das bläst das Log gewaltig auf, und ich finde es „etwas“ nervig. Besonders lustig ist das ja bei Bildern vom Nokia 2.2 (Smartphone), da werden sie meistens mit reingeschrieben, aber manchmal auch nicht. Aber das ist insgesamt nur ein Nebenbei-Problem.
Ich konnte auch keinen Zusammenhang damit erkennen, daß die Bilder (aus allen Kameras/Scannern) teilweise vorher auch schon mit The GIMP bearbeitet wurden (der die ursprünglichen EXIF-Daten unangetastet läßt bzw. sich nur noch unter dem Tag „Software“ mit dazuschreibt).
Es fällt nun auf, daß die Dateien der aus den Canon-Kameras stammenden Bilder nach der Bearbeitung mit PIL allesamt keine EXIF-Daten in den Zieldateien haben, obwohl diese in den Ausgangsdateien – egal ob mit GIMP bearbeitet oder nicht – vorhanden sind. Diese Daten hätte ich aber da schon ganz gern weiterhin drin.
Genau genommen sieht das dann so aus:
$ exif 20130625-143032_2283.jpg
Beschädigte Daten
Die gelieferten Daten entsprechen nicht der Spezifikation.
ExifMnoteCanon: Invalid zero-length tag size
Mir erschließt sich auch die Logik nicht – was macht die EXIF-Daten aus den Canon-Kameras so anders, daß piexif sie zwar liest und PIL sie anwenden kann, PIL sich dann aber weigert (übrigens ohne jegliche Fehlermeldung und ohne Log-Eintrag), sie wieder mit abzuspeichern?
Jemand 'ne Idee?