Erstelldatum in .jpg setzen/ändern

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.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Mittwoch 16. Dezember 2009, 11:10

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.

Code: Alles auswählen

os.utime 
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
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Mittwoch 16. Dezember 2009, 14:31

Hallo HWK,

das könnte ich auch gerade gut brauchen.. Leider scheint der Link nicht zu funktionieren.

Gruß
alpha
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Mittwoch 16. Dezember 2009, 15:00

Ich hab's leider auch nicht anderweitig gefunden. Das könnte eine Alternative sein. Ich habe aber keine Erfahrungen damit.
MfG
HWK
Benutzeravatar
jens
Moderator
Beiträge: 8489
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 16. Dezember 2009, 15:47


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Mittwoch 16. Dezember 2009, 19:48

Danke an alle, ich habe es über google gefunden....

http://code.google.com/p/pipp/downloads ... .win32.zip
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Donnerstag 17. Dezember 2009, 08:47

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
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 17. Dezember 2009, 13:07

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
Benutzeravatar
jens
Moderator
Beiträge: 8489
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 17. Dezember 2009, 13:14

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Donnerstag 17. Dezember 2009, 13:34

@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?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 17. Dezember 2009, 14:07

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
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Donnerstag 17. Dezember 2009, 14:11

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 8) , nichtzuletzt dank Deiner Hilfe bei dem Problem mit den .pdf Dateien.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 17. Dezember 2009, 18:26

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
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Freitag 18. Dezember 2009, 08:27

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)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 18. Dezember 2009, 14:01

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
Antworten