Modul pyexif2 Problem

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Hein_nieH
User
Beiträge: 18
Registriert: Dienstag 24. Januar 2012, 13:21
Wohnort: Rostock

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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)
Hein_nieH
User
Beiträge: 18
Registriert: Dienstag 24. Januar 2012, 13:21
Wohnort: Rostock

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
Hein_nieH
User
Beiträge: 18
Registriert: Dienstag 24. Januar 2012, 13:21
Wohnort: Rostock

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
BlackJack

@Hein_nieH: Die elegante Lösung wäre wohl die richtige Kodierung zu verwenden:

Code: Alles auswählen

In [11]: u'Hällö'.encode('utf16')[2:]
Out[11]: 'H\x00\xc3\x00\xa4\x00l\x00l\x00\xc3\x00\xb6\x00'
Hein_nieH
User
Beiträge: 18
Registriert: Dienstag 24. Januar 2012, 13:21
Wohnort: Rostock

Hallo BlackJack,

habe ich proiert funzt aber nicht.
Wie muesste denn er Code deiner Meinung nach geändert werden?

Wie bereits gesagt, ich bin nur durch experimentieren darauf gekommen.

Gruss Hein_nieh
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hein_nieH hat geschrieben: habe ich proiert funzt aber nicht.
Zeig uns doch mal Deinen Versuch - und präzisiere, was "funzt nicht" bedeutet ;-) (Ok, in diesem Kontext nehme ich mal an, dass es wie früher einfach keine Änderung gubt - aber so etwas solltest Du *immer* explizit schreiben)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Hein_nieH
User
Beiträge: 18
Registriert: Dienstag 24. Januar 2012, 13:21
Wohnort: Rostock

Code: Alles auswählen

y=y.encode('utf16')[2:]
metadata['Exif.Image.XPComment'].value=y
Statt y=y.replace(' ',' 0 ') habe ich es mit y=y.encode('utf16')[2:]
versucht.
In der jpg-Datei sieht man dann nur ein einzelnes Zeichen.
Verewendet man die replace-Methode, so ist der übergebene String in der jpg-Datei vollständig sichtbar.
Ich vermute jedoch, dass das Modul pyexiv2 insichtlich dieser Tags noch eine Macke hat, siehe auch den Kommentar von /me.

Gruss hein_nieH
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du rufst `encode` auf dem falschen Objekt auf - sofern Deine Bezeichner mit obigen Code übereinstimmen¹. Du musst das mit dem `x`-Objekt aufrufen - der Typ von `y` ist doch irgend etwas "verqueres" - oder was sagt Dir `type(y)` ohne das `encode`?

¹`x` und `y` sind eher schlechte Namen in diesem Kontext! Die sagen nichts aus...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Hein_nieH
User
Beiträge: 18
Registriert: Dienstag 24. Januar 2012, 13:21
Wohnort: Rostock

....aha.
So funktioniert es:

Code: Alles auswählen

Text=u'Ha Ha Ha Ha Oho'
Text=Text.encode('utf16')[2:]
TextNachUtils = pyexiv2.utils.string_to_undefined(Text)
metadata['Exif.Image.XPComment'].value = TextNachUtils
metadata.write()
... war ein Denkfehler von mir.

Gruss Hein_nieH
Antworten