2010-06-28 19 views
8

Próbuję pobrać plik obrazu, zrobić kilka rzeczy i zapisać zmiany z powrotem do oryginalnego pliku. Problem polega na nadpisaniu oryginalnego obrazu; nie wydaje się być niezawodne sposób zwolnić uchwyt na filename.Jak zamknąć obraz?

Potrzebuję, aby ta zawartość została zapisana z powrotem do tego samego pliku, ponieważ procesy zewnętrzne zależą od tej nazwy pliku, aby pozostać bez zmian.

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 pracowała aż dodano obsługę wyjątków, gdzie wykonany kopię obrazu. Próbowałem również uzyskać dostęp do atrybutu Imagei with image, bez powodzenia.

Odpowiedz

16

Można podać obiekt podobny do pliku zamiast nazwy pliku do funkcji Image.open. Więc spróbuj tego:

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

Tak blisko, że powinienem był to wyczuć. – Chris