Seite 1 von 2

Modul pyexif2 Problem

Verfasst: Dienstag 24. Januar 2012, 14:29
von Hein_nieH
Hallo liebe Pythongemeinde,

ich bin mehr oder weniger Python-Neuling. :)
Ich nutze Python 2.6 unter WindowsXP.

Für ein selbst gestricktes Fotoarchiv möchte ich via Python-script die Attribute
Titel, Thema, Autor, Kommentar
einer Jpg.Datei ändern.
Hierzu habe ich das Modul Pyexif2 version 0.2.2 installiert.

Mit meinem Script erhalte ich folgende keys

Exif.Image.XPTitle
Exif.Image.XPComment
Exif.Image.XPAuthor
Exif.Image.XPSubject

Die Textinhalte werden zunächst als Bytefolge dargestellt.
Wenn ich zur Darstellung die Methode
metadata[key].Human_value verwende erhalte ich eine Stringausgabe.

Code: Alles auswählen

import pyexiv2
inFile=r"Test_Image.jpg"

metadata = pyexiv2.ImageMetadata(inFile)
metadata.read()

for x in metadata.exif_keys:
    key=x
    print metadata[key]


metadata['Exif.Image.XPComment']='Bl Bla'
metadata.write()
Nun hierzu Meine Probleme:
1. Beim Abfragen der Keys werden die Keys von nicht ausgefüllten Attributfeldern,
wie z.B. Exif.Image.XPComment, nicht
angezeigt, wenn das Feld leer ist.
Ist das normal. :?:
2. Wie kann ich einen Kommentar ändern.
Mein Skript läuft zwar fehlerfrei, jedoch wird der Kommentar nicht geändert. :cry:
3. Woher kommen die keys
Exif.Image.XPTitle
Exif.Image.XPComment
Exif.Image.XPAuthor
Exif.Image.XPSubject?
Laut Dokumentation von pyexif2 gibt es diese gar nicht.

Ganz so einfach, wieesin der Doku steht funktioniert es bei mir doch nicht.
Habe ich etwas falsch gemacht??? :roll:

Für einen Profi mögen meine Fragen zwar trivial sein, jedoch komme ich nicht weiter.
Ich habe auch in Google schon eineiges durchgeforstet.

Also, für eine Antwort wäre ich sehr dankbar. :D
Gruss Hein_nieH

Schreibfehler Modul pyexif2 Problem -> pyexiv2 Problem

Verfasst: Dienstag 24. Januar 2012, 18:14
von Hein_nieH
Hallo,

kleiner Hinweis: Ich habe mich verschrieben: :mrgreen:

Das Modul heisst pyexiv2 und nicht pyexif2

Re: Modul pyexif2 Problem

Verfasst: Dienstag 24. Januar 2012, 19:12
von /me
Hein_nieH hat geschrieben:1. Beim Abfragen der Keys werden die Keys von nicht ausgefüllten Attributfeldern, wie z.B. Exif.Image.XPComment, nicht angezeigt, wenn das Feld leer ist.
2. Wie kann ich einen Kommentar ändern.
Mein Skript läuft zwar fehlerfrei, jedoch wird der Kommentar nicht geändert. :cry:
3. Woher kommen die keys
Exif.Image.XPTitle
Exif.Image.XPComment
Exif.Image.XPAuthor
Exif.Image.XPSubject?
zu 1: Was nicht da ist kann nicht angezeigt werden.
zu 2: Der Versuch Daten nach metadata['Exif.Image.XPComment'] zu schreiben führt bei mir zu einem "ValueError: Invalid value". Das Schreiben nach metadata['Exif.Photo.UserComment'] hingegen funktioniert bei mir problemlos und in der Datei landen die Daten dann auch.
zu 3: Unter http://exiv2.org/tags.html finde ich die Tags.

Meine Umgebung: Python 2.7.2 (32bit); pyexiv2 0.3.2

Genauer kenne ich mich damit auch nicht aus. Ich habe das Modul eben nur kurz zum Test installiert.

Re: Modul pyexif2 Problem

Verfasst: Dienstag 24. Januar 2012, 19:33
von Hein_nieH
Hallo /me,

erstmal vielen Dank für die Antwort.

Irgendwie geistert auf meonem Rechner der Datenkobold.
Selbst beim Attribut ['Exif.Photo.UserComment'] ändert sich im Kommentarfeld nichts.

Hier mein Quellcode

Code: Alles auswählen

from pyexiv2 import ImageMetadata
from datetime import datetime, timedelta

inFile=r"Test_Image.jpg"
metadata = ImageMetadata(inFile)
metadata.read()
timestamp=metadata["Exif.Image.DateTime"].value
print timestamp
for x in metadata.exif_keys:
    key=x
    print metadata[key]

metadata['Exif.Photo.UserComment'].value="Bla Bla Bla"
metadata.write()
Wie hat sich der Autor des Moduls pyexiv2 denn das gedacht, die Attribute Autor, Stichwoerter, Thema zu ändern?
Es muss doch einen Weg geben via Stringzuordnung diese Attribute neu zu beschreiben.
Ich habe auch nochmal die Doku zum Modul durchforstet, bin aber noch nicht dahinter gekommen.
Wenn ich's raus habe , dann melde ich mich......

Gruss Hein_nieH
Trotzdem ich bleib am Ball

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 11:29
von Leonidas
Also wenn das bei /me funktioniert und bei dir nicht, siehst du tatsächlich in der richtigen Datei nach? Hat dein Betrachter vielleicht eine Art Cache wo noch die alten Daten drin stehen?

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 11:51
von Hein_nieH
Hallo Leonidas,

metadata['Exif.Photo.UserComment'].value="Bla Bla Bla"
Das Schreiben für dieses Attribut funktioniert.

Wenn ich die Attribute erneut auslese, dann steht bei metadata['Exif.Photo.UserComment'].value auch "Bla Bla Bla" drin.
Wenn mir von der Jpg-Datei die Attribute im Explorer anzeigen lasse, dann steht bei Eigenschaften->Reiter: Dateiinfo ->Rubrik: Beschreibung ->Kommentar
nicht der geänderte Attributwert. Das ist mein Problem.
Ich benötige also eine Lösung, in dem ich auch die in den Rubriken 'Beschreibung' befindlichen Kommentare, wie Thema, Stichworte, Kommentar ändern kann. Und vor allem die Attribute mussen auch beim Betrachten der Dateieigenschaften sichtbar sein.

Gruss Hein_nieH

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 12:08
von Hyperion
Hein_nieH hat geschrieben: Wenn ich die Attribute erneut auslese, dann steht bei metadata['Exif.Photo.UserComment'].value auch "Bla Bla Bla" drin.
Wie / womit liest Du das denn aus?
Hein_nieH hat geschrieben: Wenn mir von der Jpg-Datei die Attribute im Explorer anzeigen lasse, dann steht bei Eigenschaften->Reiter: Dateiinfo ->Rubrik: Beschreibung ->Kommentar
nicht der geänderte Attributwert. Das ist mein Problem.
Das war Leonidas ja klar - das Problem kann doch nun folgende Ursachen haben:

- Du machst einen Fehler beim Schreiben und Deine Prüfung ist falsch / verfälscht
- Dein Betrachter speichert Dinge in einem Cache und liest den geänderten Wert somit nicht sofort ein

Vielleicht erläuterst Du uns mal Deine Prüfmethode und erwägst einmal, Dir das ganze in einem Hexeditor anzugucken - der sollte als "neutrale" Instanz die tatsächlichen Werte der Datei anzeigen und somit Gewissheit geben, wo das Problem zu suchen ist.

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 12:39
von Hein_nieH
Hallo Hyperion,

Hier ein kurzer Ausschnitt aus dem Quelltext (siehe oben)

Code: Alles auswählen

metadata['Exif.Image.XPComment']='Bla Bla' # neue Zuweisung zum Kommentar-Attribut
metadata.write()
Meine Prüfmethode ist folgende:
Nach Ausführung des Scriptes öffne ich die Jpg-Datei im Explorer und sehe mir unter Eigenschaften die Attribute an.
Mein Problem: metadata['Exif.Image.XPComment']='Bla Bla' zeigt keine Wirkung beim Betrachten der Attribute, d.h. im Feld Kommentare steht noch der alte Wert, aber nicht 'Bla Bla'. :cry:
Ursprünglich dachte ich, es wäre eine einfache Sache, aber der Teufel steckt im Detail....
Ist im Quellcode denn etwas falsch? Bei der Scriptabarbeitung zeigt die IDLE keinen Fehler an.
Die Methode write() scheint zu funktionieren, da das Änderungsdatum der jpg-Datei mit dem Zeitpunkt der Scripabarbeitung übereinstimmt.
Mitlerweile bin ich bereit auch ein anderes Modul als pyexiv2 zu verwenden.

Gruss Hein_nieH

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 12:42
von Hyperion
Hein_nieH hat geschrieben: Die Methode write() scheint zu funktionieren, da das Änderungsdatum der jpg-Datei mit dem Zeitpunkt der Scripabarbeitung übereinstimmt.
Na also das ist aber eine denkbar schlechte Überprüfung - damit weisst Du doch noch lange nicht, ob die geänderten Daten in die Datei geschrieben worden sind!

Ich habe dazu ja einen Vorschlag gemacht...

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 13:17
von Hein_nieH
Hallo Hyperion,

habe ich auch probiert.
Was würdest du in meinem Fall konkret unternehmen?
Ich bekomme langsam eine Glaubenskrise...

Beim Auslesen der Attributwerte via Pythonscript stehen immer noch die altene Werte drin.
Gruss Hein_nieH

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 13:34
von Hyperion
Hein_nieH hat geschrieben: Was würdest du in meinem Fall konkret unternehmen?
Na eben mit einem Hexeditor die Datei angucken und prüfen, ob die neuen Werte da drin stehen... schrieb ich doch oben schon!
Hein_nieH hat geschrieben: Beim Auslesen der Attributwerte via Pythonscript stehen immer noch die altene Werte drin.
Ich dachte das hättest Du schon getan? Also dann ist es doch offensichtlich, dass das Schreiben so noch nicht funktioniert hat. Die Frage ist halt, wieso nicht? Das kann sowohl ein Bug, als auch Dein Fehler sein. Vielleicht übergibst Du einen falschen Typen? Vielleicht führst Du auch nicht alle notwendigen Schritte aus, um Werte wirklich in die Datei zu schreiben?

Es muss da doch eine Doku geben und idealerweise vielleicht auch Beispiele, die das zeigen? Ggf. musst Du da auch mal in den Quellcode der Tests gucken?

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 14:27
von Hein_nieH
Hallo,

ich habe mir die jpg-Datei mit einem Hex-Editor angesehen.
Da kann ich die via Python Script erzeugten Änderungen der Attribute auch nicht finden.

Es muss doch einen Weg geben....

Gruss Hein_nieH

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 14:32
von Hyperion
Hein_nieH hat geschrieben: Es muss doch einen Weg geben....
Poste uns doch mal *exakt* den Quellcode, welchen Du dafür verwendest. Und dann poste und doch mal exakt die Bilddaten, welche Du verwendest. Im Zweifel können wir das dann lokal überprüfen und man kommt einem Bug oder einem grundsätzlichen Problem auf die Spur?

/me hatte ja schon mal etwas ausprobiert, was bei ihm geklappt hat...

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 15:14
von Hein_nieH
Hallo,

anbei nochmal der Code:

Code: Alles auswählen

from pyexiv2 import ImageMetadata

inFile=r"Test_Image.jpg"
metadata = ImageMetadata(inFile)
metadata.read()

for x in metadata.exif_keys:
    key=x
    print metadata[key] # hier werden die Inhalte der Attribute angezeigt

metadata['Exif.Photo.UserComment'].value="Bla Bla Bla" # funktioniert ist mit Hexeditor sichtbar
metadata['Exif.Image.XPComment']="Blub Blub Blub" # funktioniert nicht
metadata.write()
Du kannst jedes beliebige Foto im jpg-format nutzen.
Hoffentlich habe ich keinen grundsätzlichen Fehler in meinem Script. :roll:

Gruss Hein_nieH

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 15:54
von BlackJack
@Hein_nieH: Dir fällt zwischen den beiden Zeilen aber schon ein Unterschied auf, oder!?

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 16:00
von /me
Man sollte nicht ausschließen, dass es sich um einen Fehler in der Library handelt oder dass Boost irgendwas mit der Schnittstelle angestellt hat was nicht korrekt ist.

Unter http://exiv2.org/tags.html ist der "Datentyp" von Exif.Photo.UserComment mit Comment angegeben. Exif.Image.XPComment ist vom Typ Byte mit der Anmerkung "Comment tag used by Windows, encoded in UCS2". Ich habe natürlich versucht UTF16-codierte Daten hineinzuwerfen, aber auch das hat nicht geklappt. Entweder ist das Tag wohl nicht unterstützt oder fehlerhaft implementiert - oder wir machen hier grundlegend etwas falsch.

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 16:09
von Hein_nieH
Hallo Black Jack,

ich gehe mal davon aus, dass du auf die Methode value anspielst.
Ich habe beide Varianten probiert - Zuweisung mit und ohne value und das bei beiden keys. Es ändert am Ergbnis nichts. :K


Hallo /me,

danke dass du mir Rückendeckung gibst :D .
Ich bin mit meinem Anfänfer-Latain erst mal am Ende.
Trotzdem versuche ich dem Problem auf die Spur zu kommen.

Gruss Hein_nieH

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 16:27
von /me
Hein_nieH hat geschrieben:Trotzdem versuche ich dem Problem auf die Spur zu kommen.
Nimm das:

Code: Alles auswählen

key = 'Exif.Image.XPComment'
value = pyexiv2.utils.string_to_undefined('This is a useful comment')
metadata[key] = value
Zum Auslesen brauchst du dann

Code: Alles auswählen

value = pyexiv2.utils.undefined_to_string(metadata[key].value)

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 16:44
von Hein_nieH
Hallo /me,

vielen Dank für die Info.
Wir kommen der Sache ein Stück näher.
Im Kommentarfeld der jpg-Datei werden jetzt unlesbare Zeichen (Kästchen) geschrieben.
Scheinbar müssen diese noch richtig codiert werden.
Aber immerhin, beim Betrachten der Datei-Eigenschaften sieht man schon mal, das da vom Python-Script etwas hereingeschrieben wurde.

Gruss Hein_nieH

Re: Modul pyexif2 Problem

Verfasst: Mittwoch 25. Januar 2012, 17:48
von Hein_nieH
Heureka

also, nachdem ich den Hinweis von /me erhalten habe und das Schreiben ins Kommentarfeld funktionierte, habe ich mir das Ergebnis im HexEditor angesehen.
Dabei ist mir folgendes aufgefallen:
Zielstellung Komentar: Bla Bla
Manuelle (also direkt via Explorer) eingetragene Werte werden im Hexeditor wie folgt dargestellt: B l a B l a
x='Bla Bla'
Mit pyexiv2.utils.string_to_undefined(x) geschriebene Werte werden im HexEditor als ASCII-code ohne Lerrzeichen dargestellt.
type(pyexiv2.utils.string_to_undefined(x) ist vom Typ String. :mrgreen:

Wenn man jetzt in x jeden Space mit ' 0 ' ersetzt, dann kann man den erzeugten Text auch in der jpg-Datei lesen.

Code: Alles auswählen

import pyexiv2

inFile=r"C:\Home\THA6ED\Putzar_Privat\Programmierung_Python\pyexif2\Test_Image.jpg"
metadata = pyexiv2.ImageMetadata(inFile)
metadata.read()

for x in metadata.exif_keys:
    key=x
    print metadata[key] # hier werden die Inhalte der Attribute angezeigt
    
x=u"Bla Bla"
y=pyexiv2.utils.string_to_undefined(x)
y=y.replace(' ', ' 0 ')
metadata['Exif.Image.XPComment'].value=y

metadata.write()
So richtig logisch erscheint mir das zwar nicht, aber es funktioniert. :P
Trotzdem würde mich weiterhin interessieren, ob es auch eine elegente Lösung gibt.

Gruss Hein_nieH