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.
Modul pyexif2 Problem
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 .
Ich bin mit meinem Anfänfer-Latain erst mal am Ende.
Trotzdem versuche ich dem Problem auf die Spur zu kommen.
Gruss Hein_nieH
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 .
Ich bin mit meinem Anfänfer-Latain erst mal am Ende.
Trotzdem versuche ich dem Problem auf die Spur zu kommen.
Gruss Hein_nieH
Nimm das:Hein_nieH hat geschrieben:Trotzdem versuche ich dem Problem auf die Spur zu kommen.
Code: Alles auswählen
key = 'Exif.Image.XPComment'
value = pyexiv2.utils.string_to_undefined('This is a useful comment')
metadata[key] = value
Code: Alles auswählen
value = pyexiv2.utils.undefined_to_string(metadata[key].value)
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
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
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.
Wenn man jetzt in x jeden Space mit ' 0 ' ersetzt, dann kann man den erzeugten Text auch in der jpg-Datei lesen.
So richtig logisch erscheint mir das zwar nicht, aber es funktioniert.
Trotzdem würde mich weiterhin interessieren, ob es auch eine elegente Lösung gibt.
Gruss Hein_nieH
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.
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()
Trotzdem würde mich weiterhin interessieren, ob es auch eine elegente Lösung gibt.
Gruss Hein_nieH
@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'
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
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
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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)Hein_nieH hat geschrieben: habe ich proiert funzt aber nicht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Code: Alles auswählen
y=y.encode('utf16')[2:]
metadata['Exif.Image.XPComment'].value=y
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
- 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...
¹`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
assert encoding_kapiert
....aha.
So funktioniert es:
... war ein Denkfehler von mir.
Gruss Hein_nieH
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()
Gruss Hein_nieH