Seite 1 von 1

PIL Exif gibt Umlaute aus - wie decodieren?

Verfasst: Samstag 4. Januar 2020, 14:31
von Mawilo
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

Re: PIL Exif gibt Umlaute aus - wie decodieren?

Verfasst: Samstag 4. Januar 2020, 15:13
von __deets__
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.

Re: PIL Exif gibt Umlaute aus - wie decodieren?

Verfasst: Samstag 4. Januar 2020, 15:22
von Mawilo
Danke, das ist die Lösung. Jetzt passt es.

Re: PIL Exif gibt Umlaute aus - wie decodieren?

Verfasst: Samstag 4. Januar 2020, 15:26
von __deets__
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.

Re: PIL Exif gibt Umlaute aus - wie decodieren?

Verfasst: Samstag 4. Januar 2020, 15:59
von __blackjack__
@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.

Re: PIL Exif gibt Umlaute aus - wie decodieren?

Verfasst: Samstag 4. Januar 2020, 16:18
von Mawilo
@__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.