2010-06-28 6 views
8

J'essaie de prendre un fichier image, de faire des choses et d'enregistrer les modifications dans le fichier d'origine. Le problème que j'ai est d'écraser l'image originale; il ne semble pas y avoir un moyen fiable de libérer la poignée sur filename.Comment fermer une image?

J'ai besoin que ce contenu soit sauvegardé dans le même fichier car les processus externes dépendent de ce nom de fichier pour rester les mêmes.

def do_post_processing(filename): 
    image = Image.open(str(filename)) 
    try: 
     new_image = optimalimage.trim(image) 
    except ValueError as ex: 
     # The image is a blank placeholder image. 
     new_image = image.copy() 
    new_image = optimalimage.rescale(new_image) 
    new_image.save('tmp.tif') 
    del image 

    os.remove(str(filename)) 
    os.rename('tmp.tif', str(filename)) 

del image travaillait jusqu'à ce que j'ajouté le gestionnaire d'exception où j'ai fait une copie de l'image. J'ai également essayé d'accéder à un attribut close() de Image et with image, sans succès.

Répondre

16

Vous pouvez fournir un objet de type fichier au lieu d'un nom de fichier à la fonction Image.open. Donc, essayez ceci:

def do_post_processing(filename): 
    with open(str(filename), 'rb') as f: 
     image = Image.open(f) 
     ... 
     del new_image, image 
    os.remove(str(filename)) 
    os.rename(...) 
+0

Si près que j'aurais pu le sentir. – Chris