PIL-Problem: Wie schließe ich ein Bild

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.
Antworten
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Hallo,

ich habe folgendes Problem: ich öffne ein jpg und lese die exif-Daten aus mit im._getexif(). Anschließend möchte ich das Aufnahmedatum in den Dateinamen schreiben. Allerdings kam da folgende Fehermeldung

WindowsError: [Error 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird

Ich nehme an, das JPG kann nicht umbenannt werden, weil es noch geöffnet ist vom Auslesen der Bildinformationen. Ich habe allerdings keine close-Funktion gefunden. Ich behelfe mir jetzt wie folgt:

Code: Alles auswählen

im = Image.open(pic)
  exdata = im._getexif()
  date = exdata[36868][0:4] +"_" + exdata[36868][5:7] + "_" +  exdata[36868][8:10]
  name = str(date) + "_" + suffix + "_" +  str(n)

  print name
  del(im)
  os.rename(os.path.join(path,pic), os.path.join(path,"%s.jpg")%(name)) 
Gibt es eine elegantere Lösung?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du könntest ``Image.open()`` ein ``file``-Objekt übergeben und es dann selbst schließen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich habe das bisher auch immer mit del gemacht.
MfG
HWK
BlackJack

@HWK: Wobei das aber leider nicht 100% zuverlässig ist. Selbst bei CPython kann man Situation bekommen, wo es noch, nicht ganz so offensichtliche, Referenzen geben kann.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

meneliel hat geschrieben:Gibt es eine elegantere Lösung?

Code: Alles auswählen

im.fp.close()
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Darii hat geschrieben:

Code: Alles auswählen

im.fp.close()
Offensichtlich existiert das File-Objekt nach im.save() nicht mehr, im.fp ist also None.
MfG
HWK
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

HWK hat geschrieben:
Darii hat geschrieben:

Code: Alles auswählen

im.fp.close()
Offensichtlich existiert das File-Objekt nach im.save() nicht mehr, im.fp ist also None.
MfG
HWK
Kann man dann nicht davon ausgehen, dass das vom "im"-Objekt selber geschlossen wird?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Hyperion hat geschrieben:Kann man dann nicht davon ausgehen, dass das vom "im"-Objekt selber geschlossen wird?
Offensichtlich. Aber die Ursprungsdatei kann ich trotzdem nicht löschen. Erst nach einem del funktioniert es bei mir.
MfG
HWK
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Tja, da hilft dann wohl nur ein Blick in den Sourcecode. In der Doku steht dazu ja wirklich nichts explizites, außer wann das Lesen passiert.

Wobei auch das Attribut "fp" dort nicht erwähnt wird, oder ich habs übersehen.

Eine Alternative könnte es doch sein, mit StringIO zu arbeiten. Damit könnte man den Dateizugriff vor PIL kapseln und die Datei unabhängig von der Bildmanipulation schließen oder was auch immer.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

So ähnlich hat es Leonidas ja schon vorgeschlagen.
MfG
HWK
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Hallo Ihr,

ich habe mit dem Script seit neustem ein Problem. Habe noch ein bisschen dran herum gebastelt, allerdings an der Zeile:

Code: Alles auswählen

os.rename(os.path.join(path,pic), os.path.join(path,"%s.jpg")%(name))
nichts geändert.

Nun bekomme ich ständig die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\Maria\Desktop\rename_pics.py", line 37, in <module>
    os.rename(os.path.join(path,pic), os.path.join(path,"%s.jpg")%(name))
WindowsError: [Error 123] Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch
Ich kann mir das nicht erklären. Da das ja schon funktionierte. Und den Eingabe-Pfadnamen habe ich geprüft, ob er existiert und bekomme ich ein True zurück. Den Ausgabepfadnamen hab ich mir ausgeben lassen und da sieht auch nix verkehrt dran aus. Ich habe jetzt schon ne ganze Weile nix mehr programmiert, vielleicht bin ich einfach aus der Übung und sehe daher den Wald vor lauter Bäumen nicht, weiß aber auch nicht mehr, was ich noch ändern/überprüfen kann.

Achso: das Script geschrieben hatte ich damals für WinXP, nutze es jetzt unter Vista, aber selbst da lief es im Sommer schon mal.

Vielen Dank für Eure Hilfe.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann lass dir doch mal die Ergebnisse der einzelnen Schritte ausgeben, dann kommst du von alleine auf deinen Fehler.
Das Leben ist wie ein Tennisball.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Auch das hatte ich letzte Woche schon probiert. Nehme das wohl aber noch ein weiteres Mal in Angriff.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

.... okay, man sollte natürlich auch daran denken, dass ein ":" im Ausgabedateinamen nicht geht ... Da guck ich 2 Wochen lang diese Fehlermeldung und die Aus- und Eingabepfade an und komm erst drauf, nach dem Posten hier. Entschuldigung für die Störung. :oops:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also, naja, es geht schon, nur nicht auf allen Platformen. Die ext-Dateisysteme akzeptieren problemlos Doppelpunkte.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten