PIL Exif gibt Umlaute aus - wie decodieren?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Hallo,

ich möchte in einer Django-Anwendung beim Hochladen von Bildern die Exif-Daten auslesen und speichern. Das funktioniert auch alles ganz schick. Nur wenn in den Exif-Daten z.B. in der Beschreibung des Bildes Umlaute enthalten sind, sieht die Ausgabe nicht gut aus. Das scheint wieder so ein Thema mit encoding/decoding zu sein und ich komme da nicht weiter.

Hier der Beispielcode:

Code: Alles auswählen

from PIL import Image, ExifTags

pic = './IMG_2019_09_21_5630.jpg'

def read_img():
    
    with Image.open(pic) as img:
        img.verify()
 
        ef = img._getexif()
        exif = {}
        for (key, value) in ef.items():
            exif[ExifTags.TAGS.get(key)] = value

        description = exif['ImageDescription']
        print(description)

        description = description.encode('utf-8')
        print(description)

read_img()
Die Ausgabe der ersten print-Anweisung ist:
Zug 9005 mit Lok 99 1773-3 fährt mit dem Personenzug in Richtung Oberwiesenthal und passiert hier einen Bahnübergang in Neudorf.

Die Ausgabe der zweiten print-Anweisung ist:
b'Zug 9005 mit Lok 99 1773-3 f\xc3\x83\xc2\xa4hrt mit dem Personenzug in Richtung Oberwiesenthal und passiert hier einen Bahn\xc3\x83\xc2\xbcbergang in Neudorf.'

Hat jemand einen Hinweis für mich, wie ich den Text vernünftig lesbar darstellen kann? Das betreffende Bild zum Testen kann unter https://flic.kr/p/2hwRZeq heruntergeladen werden.

Danke und viele Grüße
Stephan
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast falsch als latin1 dekodiertes UTF-8 in der EXIF Beschreibung. Sprich: der String darin ist UTF-8, wird aber als latin1 interpretiert. Dadurch wird aus einem Zeichen zwei. Um das zu reparieren musst du das Gegenteil tun: Encode als latin1, und die Bytes dann wieder als UTF-8 dekodieren.
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Danke, das ist die Lösung. Jetzt passt es.
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bin mir nicht sicher, ob das "die" Loesung ist. Das funktioniert *hier*. Aber das Ursprungsproblem wird sein, dass EXIF diezbezueglich eher nicht genormt ist. Du bekommst also auch latin1 (oder sonstewas) fuer Daten. Du solltest also eine Heuristik schreiben.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mawilo: `_getexif()` ist ein interner Name der nicht für die Verwendung von aussen gedacht ist. Die Methode die Du aufrufen willst heisst `getexif()` ohne den führenden Unterstrich. Falls es die nicht geben sollte, müsstest Du Pillow mal aktualisieren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

@__blackjack__: Danke für den Hinweis. Ich hatte noch eine ältere Version von Pillow installiert, da die neue nicht mit django-exiffield kompatibel ist. Aber da ich das django-Modul nicht mehr verwende, habe ich flugs Pillow aktualisiert.

@ __deets__: Da der Bildtitel und die Bildbeschreibung nicht von der Kamera kommen, sondern über Bildbearbeitungssoftware eingetragen werden, ist die Vielfalt sicherlich groß. Ich habe das mit Photoshop und Lightroom getestet. Da funktioniert der Weg wie beschrieben.
Antworten