2010-06-28 9 views
8

Estoy tratando de tomar un archivo de imagen, hacer algunas cosas y guardar los cambios en el archivo original. El problema que estoy teniendo es sobreescribir la imagen original; no parece haber una manera confiable de liberar el mango en filename.Cómo cerrar una imagen?

Necesito que este contenido se guarde en el mismo archivo porque los procesos externos dependen de ese nombre de archivo para permanecer igual.

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 estaba trabajando hasta que he añadido el gestor de excepciones donde hice una copia de la imagen. También intenté acceder a un atributo close() de Image y with image, sin éxito.

Respuesta

16

Puede proporcionar un objeto similar a un archivo en lugar de un nombre de archivo a la función Image.open. Así que intente esto:

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

Tan cerca que debería haberlo podido oler. – Chris