Binärdatei (jpeg) bearbeiten

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
DB7WN
User
Beiträge: 49
Registriert: Samstag 18. März 2017, 22:11

Hallo Spezialisten!
Ich möchte die Exif-Daten von jpeg-Dateien lesen und weiter verarbeiten.
Ich weiß, mit IRFAN-View und mit Windows-Datei-Eigenschaften kann man diese Daten lesen, aber nicht gut weiterverarbeiten. Außerdem reizt es mich, das mal "zu Fuß" zu machen.
Bisher hab ich mir angesehen, wie die Exif-Codierung funktioniert und hab das auch einigermaßen verstanden.
Ich muss zunächst die Position des Wortes "Exif" irgendwo an Anfang der Datei bestimmen. Von dieser Referenzposition kann man durch Abzählen der Bytes die verschiedenen TAGs finden. So weit, so gut.
Ich hab das so realisiert:

Code: Alles auswählen

f=open("z://python_workspace/Kira_Exif.jpg","rb")
b=f.read()
bd=str(b)
a= bd.find('Exif')
16 Bytes weiter beginnt der Eintrag für den ersten TAG – und da ist mein Problem.
In einem HEX-Editor sieht das so aus:

45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08 00 08 01
E x i f . . M M . * . . . . . . .

"print(b)" im Python-Programm liefert das:
\x1cExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x08\x01\x0f\x00\x02\x00\x00\x00\x1

darstellbare Zeichen werden dargestellt, nicht darstellbare werden in HEX-Code mit Backslash als Trenner geprintet. Das Abzählen der Bytes ist so nicht ohne weiteres möglich. Hat jemand einen Vorschlag, wie man da am besten vorgeht.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@DB7WN: der Aufruf von ›str‹ ist unsinnig; Du willst ja mit Bytes arbeiten. Daneben hilft Dir das struct-Modul.
DB7WN
User
Beiträge: 49
Registriert: Samstag 18. März 2017, 22:11

Danke für die Antwort, die Ausgabe, mit der ich so schlecht weiterarbeiten kann, kommt schon (s.o.) mit "print(b)" zustande. "b" ist noch vom Typ "binary". Dir Umwandlung durch str hab ich gemacht, weil die Funktion ".find" nur mit strings funktioniert.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@DB7WN: »print« wandelt alles in Strings um, bevor es etwas ausgeben kann. Wenn Du binäre Daten verarbeiten willst, solltest Du zumindest die Grundlagen von »bytes«-Objekten kennen.

Code: Alles auswählen

pos = b.find(b'Exif')
DB7WN
User
Beiträge: 49
Registriert: Samstag 18. März 2017, 22:11

Sirius3 hat geschrieben:Daneben hilft Dir das struct-Modul.
"struct" ist mir bisher noch nicht begegnet. Meine erste Google-Suche danach brachte eine ähnliche Frage in einem Forum zu Tage. Ich werd mal schauen. Viele deutschsprachige Einträge gibt es nicht dazu. In meinem Python-GE-PACKT Handbuch findet struct keine Erwähnung.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
In meinem Python-GE-PACKT Handbuch findet struct keine Erwähnung.
`struct`ist ein Modul, was man als Anfänger so wie so nicht braucht und auch als Fortgeschrittener eher selten bzw. in speziellen Fällen - wie z.B. deinem :-) Von daher ist das in der Print-Literautr selten zu finden.
Viele deutschsprachige Einträge gibt es nicht dazu.
Englisch ist nun mal die Standardsprache für Programmierdokus. Wenn du nur deutsch lesen willst kommst du nicht weit... Das struct-Modul ist auch in der offiziellen Python-Doku erklärt.

Gruß, noisefloor
Antworten