Seite 1 von 1
Erstelldatum in .jpg setzen/ändern
Verfasst: Mittwoch 16. Dezember 2009, 11:10
von mathi
hallo,
ich möchte in einem Bild (.jpg) das Erstelldatum setzen/ändern.
Nach langem suchen habe ich aber nur das auslesen der Exif-Daten mit PIL oder EXIFpy gefunden.
bringt ja auch nicht das gewünschte Ergebnis, weil nur "geändert" und "letzter Zugriff" geändert werden können.
Gibt es eine Möglichkeit die EXIF-Daten so zu manipulieren also z.B. statt _getexif ein _setexif o.ä.??
Gruß
Mathi
Verfasst: Mittwoch 16. Dezember 2009, 13:16
von HWK
Verfasst: Mittwoch 16. Dezember 2009, 14:31
von alpha
Hallo HWK,
das könnte ich auch gerade gut brauchen.. Leider scheint der Link nicht zu funktionieren.
Gruß
alpha
Verfasst: Mittwoch 16. Dezember 2009, 15:00
von HWK
Ich hab's leider auch nicht anderweitig gefunden.
Das könnte eine Alternative sein. Ich habe aber keine Erfahrungen damit.
MfG
HWK
Verfasst: Mittwoch 16. Dezember 2009, 15:47
von jens
Verfasst: Mittwoch 16. Dezember 2009, 19:48
von mathi
Verfasst: Donnerstag 17. Dezember 2009, 08:47
von mathi
jetzt muß ich aber noch mal um Eure Hilfe bitten,
das Paket ist wohl mit python2.6 nicht ganz kompatibel, in der Datei util.py wurde "with" als Variable verwendet, das habe ich in "with_" geändert, dann kann ich zumindest die exif daten auslesen, beim schreiben folgt dann die Fehlermeldung:
Code: Alles auswählen
File "C:\Python26\lib\site-packages\jpeg\jpeg.py", line 177, in setExif
return _write(exif.binary(), file, exif.jpegMarker)
File "C:\Python26\lib\site-packages\jpeg\jpeg.py", line 108, in _write
lenHex = util.setNr(len(value)+2, "short") #the length on 2 bytes
File "C:\Python26\lib\site-packages\jpeg\util.py", line 50, in setNr
val = struct.pack(frm, nr)
struct.error: short format requires SHRT_MIN <= number <= SHRT_MAX
ich habe das ganze mit dem Script von HWK getestet
HWK hat geschrieben:Leonidas hat geschrieben:HWK hat geschrieben:Leonidas hat geschrieben:...aber könnte mit geringen Umstand besser gemacht werden.
Wie?
``/usr/bin/env python`` oder ``/usr/bin/python`` als Pfad angeben.
Habe ich jetzt in allen meinen Scripts geändert.
Neue Programmvariante:
http://paste.pocoo.org/show/30724/
ich bin leider nicht gut genug um den Fehler zu beheben.
Danke im Voraus, ich denke dammit wäre auch später einigen geholfen.
Gruß Mathi
Verfasst: Donnerstag 17. Dezember 2009, 13:07
von HWK
Die Änderung with zu with_ in util.py habe ich auch durchgeführt. Das war glaube ich auch die einzige. Ich kann es aber nicht mehr sicher sagen, da ich die Ursprungsdatei gelöscht habe. Auf jeden Fall habe ich jpeg.py nicht geändert. Die Länge der Exif-Daten liegt ja offensichtlich nicht in den Short-Grenzen. Sind die Daten evtl. korrupt? Gibt es den Fehler bei allen JPGs? Bei mir läuft es auf jeden Fall auch unter 2.6.
MfG
HWK
Verfasst: Donnerstag 17. Dezember 2009, 13:14
von jens
Also ich nutzte in bei meinem Skript das externe Perl Programm "exiftool" (Kann man mit "apt-get install libimage-exiftool-perl" unter Linux installieren) Das Programm sollte die Daten aus den Bildern lesen können. Ansonsten sind wahrscheinlich die Bilder/Exif-Daten defekt.
Mittlerweile kann man wohl besser das Python Modul
http://tilloy.net/dev/pyexiv2/index.htm nutzten.
Verfasst: Donnerstag 17. Dezember 2009, 13:34
von mathi
@HWK
nicht bei allen(mal scheitert es ab dem 2. , meist bricht er nach der 3. oder 5. Datei ab), aber nur beim schreiben der neuen exif Daten,
Die Bilder sind nicht korrupt und wurden mit einer Sony aufgenommen. Kann ich die Daten irgendwie in die Short-Grenzen setzen/konvertieren?
Verfasst: Donnerstag 17. Dezember 2009, 14:07
von HWK
Pack doch mal einige informative Prints in die jpeg.py, damit Du siehst, was möglicherweise an den Daten nicht passt. (Vorher am besten das Original sichern)
MfG
HWK
Verfasst: Donnerstag 17. Dezember 2009, 14:11
von mathi
danke,
ausschnitt aus jpeg.py:
Code: Alles auswählen
if markerSeg or sof:
print len(value)
print len(value)+2
lenHex = util.setNr(len(value)+2, "short") #the length on 2 bytes
ergibt:
Code: Alles auswählen
DSC02054.JPG - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LEN > valueFlat 0x0 122683392 #???
LEN > valueFlat 0x800 16777339 #???
46592 #---> print len(value)
46594 #---> print len(value)+2
Traceback (most recent call last):
jpeg.setExif(exif, outname)
File "C:\Python26\lib\site-packages\jpeg\jpeg.py", line 180, in setExif
return _write(exif.binary(), file, exif.jpegMarker)
File "C:\Python26\lib\site-packages\jpeg\jpeg.py", line 110, in _write
lenHex = util.setNr(len(value)+2, "short") #the length on 2 bytes
File "C:\Python26\lib\site-packages\jpeg\util.py", line 50, in setNr
val = struct.pack(frm, nr)
struct.error: short format requires SHRT_MIN <= number <= SHRT_MAX
mich wundert auch, dass die Dateien vom z.B. 1,8 MB auf 700 kb schrumpfen, ohne dass Auflösung und Größe verändert sind, aber ich denke das liegt eher an PIL, ich werd mich bei Gelegenheit mal mit der doku beschäftigen.
@HWK
im übrigen habe ich mein Programm zum ändern der Bilder mit pool.map() multiprocessing-fähig bekommen

, nichtzuletzt dank Deiner Hilfe bei dem Problem mit den .pdf Dateien.
Verfasst: Donnerstag 17. Dezember 2009, 18:26
von HWK
Die Länge ist also größer als 0x7fff, d.h. nicht als (signed) short darstellbar. Evtl. bringt es schon etwas, in Zeile 48 von util.py 'h' durch 'H' zu ersetzen. Ansonsten solltest du einmal forschen, woher die "LEN > valueFlat"-Bemerkungen kommen. D.h. Du solltest noch ein paar Prints, evtl. auch in "meinem" Script platzieren.
Ansonsten Glückwunsch zu der Lösung Deines anderen Problems. Poste doch mal das fertige Script.
MfG
HWK
Verfasst: Freitag 18. Dezember 2009, 08:27
von mathi
die Idee mit "H" hat leider nix gebracht,der Fehler lautet jetzt:
Code: Alles auswählen
DSC02055.JPG - LEN > valueFlat 0x0 122683392
LEN > valueFlat 0x7d00 134217984
LEN > valueFlat 0x800 16777308
LEN > valueFlat 0x8a 65563
LEN > valueFlat 0x30 122684496
LEN > valueFlat 0x5 32768760
Traceback (most recent call last):
...
File "C:\Python26\lib\site-packages\jpeg\jpeg.py", line 178, in setExif
return _write(exif.binary(), file, exif.jpegMarker)
File "C:\Python26\lib\site-packages\jpeg\jpeg.py", line 109, in _write
lenHex = util.setNr(len(value)+2, "short") #the length on 2 bytes
File "C:\Python26\lib\site-packages\jpeg\util.py", line 50, in setNr
val = struct.pack(frm, nr)
struct.error: ushort format requires 0 <= number <= USHRT_MAX
ich habe mal bissel gestöbert, der Hund liegt hier begraben :
exif.py
Code: Alles auswählen
try:
self.bytes = self.typeMap[self.type]
self.len = self.bytes * self.count
except:
raise ValueError, "Value type %s is not supported for %s - %s" % (self.type, self.niceID(), repr(tag))
if self.len <= 4:
self.valueFlat = tag[8:] #as it needs to be written back into the file
self.value = self._getVal(tag[8:])
self.originalOffset = None
else:
offset = util.getNr(tag[8:], self.endian)
self.originalOffset = offset
self.valueFlat = tiff[offset: offset + self.len] #<----------
self.value = self._getVal(tiff[offset: offset + self.len]) #<----------
if (self.len>len(self.valueFlat)): #<----------
print "LEN > valueFlat", self.niceID(), self.len
self.len = len(self.valueFlat)
self.count = self.len / self.bytes
if self.count <= 0: self.count = 1
aber das sind für mich böhmische Dörfer
deit: hiermal Dein Script mit pool.map()
http://paste.pocoo.org/show/MrDZpUF2dJTjSpFzpeGZ/
ich mußte es ein bissel umschreiben, damit es funktioniert, dabei habe ich exeptions usw. mal weggelassen (war für mich nur ein Testobjekt)
Verfasst: Freitag 18. Dezember 2009, 14:01
von HWK
Das Modul scheint wohl mit Deinen JPGs nicht zurechtzukommen. Vielleicht probierst Du doch eines der anderen vorgeschlagenen.
Übrigens: Ich dachte, Du hättest Dein "PDF-Programm" jetzt multiprocessing-fähig bekommen.
MfG
HWK
Verfasst: Freitag 18. Dezember 2009, 15:18
von mathi
@HWK
nein, das pdf-Programm geht wohl nicht, weil es da auf die Reihenfolge ankommt. Ich denke, dass die Liste die pool.map() produziert nicht da ist, was pypdf erwartet.
Ich habs aufgegeben.... vielleicht irgendwann.....
was die .jpg betrifft, versuche ich mal pexif....aber jetzt geh ich erstmal ins WE
Gruß Mathi
Verfasst: Samstag 19. Dezember 2009, 21:50
von alpha
Hallo Mathi,
ich benutze auch die jpeg.py. Ich benutze daraus
jpeg.getExif und jpeg.setExif. Habe es jetzt unter Windows und Linux
mit Bildern von 3 verschieden Kameras ausprobiert und kann unter Python 2.6 kein Problem feststellen.
Vieleicht kannst Du ja ein Problembild uploaden.
Grüße und ein schönes WE
alpha
Verfasst: Samstag 19. Dezember 2009, 23:33
von mathi
@alpha
kann ich machen, pexif hat auch keine vergleichbare Funktion zu setExif

Verfasst: Montag 21. Dezember 2009, 09:38
von mathi
schade, dass es weder mit jpeg noch pexif bei mir funktioniert
hier mal ein Beispielbild..
http://www.pic-upload.de/view-4011128/DSC02060.jpg.html