Seite 1 von 1

PIL-Problem: Wie schließe ich ein Bild

Verfasst: Montag 21. September 2009, 10:10
von meneliel
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?

Verfasst: Montag 21. September 2009, 11:15
von Leonidas
Du könntest ``Image.open()`` ein ``file``-Objekt übergeben und es dann selbst schließen.

Verfasst: Montag 21. September 2009, 18:00
von HWK
Ich habe das bisher auch immer mit del gemacht.
MfG
HWK

Verfasst: Montag 21. September 2009, 18:09
von 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.

Re: PIL-Problem: Wie schließe ich ein Bild

Verfasst: Montag 21. September 2009, 19:24
von Darii
meneliel hat geschrieben:Gibt es eine elegantere Lösung?

Code: Alles auswählen

im.fp.close()

Re: PIL-Problem: Wie schließe ich ein Bild

Verfasst: Dienstag 22. September 2009, 12:38
von HWK
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

Re: PIL-Problem: Wie schließe ich ein Bild

Verfasst: Dienstag 22. September 2009, 13:00
von Hyperion
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?

Re: PIL-Problem: Wie schließe ich ein Bild

Verfasst: Dienstag 22. September 2009, 13:19
von HWK
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

Verfasst: Dienstag 22. September 2009, 15:07
von Hyperion
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.

Verfasst: Dienstag 22. September 2009, 17:28
von HWK
So ähnlich hat es Leonidas ja schon vorgeschlagen.
MfG
HWK

Re: PIL-Problem: Wie schließe ich ein Bild

Verfasst: Mittwoch 15. Dezember 2010, 09:51
von meneliel
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.

Re: PIL-Problem: Wie schließe ich ein Bild

Verfasst: Mittwoch 15. Dezember 2010, 09:56
von EyDu
Dann lass dir doch mal die Ergebnisse der einzelnen Schritte ausgeben, dann kommst du von alleine auf deinen Fehler.

Re: PIL-Problem: Wie schließe ich ein Bild

Verfasst: Mittwoch 15. Dezember 2010, 10:02
von meneliel
Auch das hatte ich letzte Woche schon probiert. Nehme das wohl aber noch ein weiteres Mal in Angriff.

Re: PIL-Problem: Wie schließe ich ein Bild

Verfasst: Mittwoch 15. Dezember 2010, 10:10
von meneliel
.... 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:

Re: PIL-Problem: Wie schließe ich ein Bild

Verfasst: Mittwoch 15. Dezember 2010, 11:41
von Leonidas
Also, naja, es geht schon, nur nicht auf allen Platformen. Die ext-Dateisysteme akzeptieren problemlos Doppelpunkte.