2010-06-28 15 views
8

Sto provando a prendere un file immagine, a fare alcune cose e salvare le modifiche al file originale. Il problema che sto avendo è quello di sovrascrivere l'immagine originale; non sembra essere un modo affidabile per rilasciare l'handle su filename.Come chiudere un'immagine?

Ho bisogno di questo contenuto per essere salvato nello stesso file perché i processi esterni dipendono da quel nome di file per rimanere lo stesso.

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 stava lavorando fino a quando ho aggiunto il gestore di eccezioni in cui ho fatto una copia dell'immagine. Ho anche provato ad accedere ad un attributo close() di Image e with image, senza successo.

risposta

16

È possibile fornire un oggetto simile a un file anziché un nome file alla funzione Image.open. Quindi prova questo:

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

Così vicino avrei dovuto essere in grado di annusarlo. – Chris