2012-02-09 25 views
5

Estoy tratando de cargar mi archivo .jpg y provoca un error, pero si lo intento de nuevo, ¡está bien! ¿¿Por qué??Python PIL, imagen. Error después de image.load()

Mi código y error:

>>> import Image 
>>> im1 = Image.open('/tmp/test.jpg') 
>>> im1.load() 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/lib64/python2.7/site-packages/PIL/ImageFile.py", line 201, in load 
raise IOError("image file is truncated (%d bytes not processed)" % len(b)) 
IOError: image file is truncated (0 bytes not processed) 
>>> im1.load() 
<PixelAccess object at 0x7feffc2a1170> 
>>> 

Gracias!

+0

El mensaje sugiere la imagen que está atando para cargar es (probablemente) que falta algunos bytes finales. ¿Por qué funciona intermitentemente, no sé, ya que no dice si la imagen es estática, etc. –

+0

¡Gracias por la respuesta! La imagen es estática. – Hare

Respuesta

8

PIL utiliza carga diferida, lo que significa que la imagen no se lee realmente del archivo hasta que intenta realizar una acción sobre ella. La primera llamada al load es esa primera acción, por lo que es cuando se detecta el problema con el formato de archivo. La segunda llamada al load no vuelve a leer el archivo, solo devuelve información que se guardó en caché cuando se cargó el archivo.

+0

Heh ... Solo que ahora noté que la segunda llamada a 'load' mencionada por OP era en el ejemplo ... –

+0

Hm, lo siento, no he dicho que el error similar ocurre cuando la primera llamada es image.show . Una segunda llamada image.show es ок. – Hare

+0

@Hare, se aplica el mismo razonamiento. La solicitud 'abrir' no lee el archivo completo, por lo que no obtiene el error. La primera operación, ya sea 'load' o' show', hace que se lea el archivo completo y se detecte el defecto del archivo. –

19

Tuve el mismo problema y se me ocurrió una solución que analizo aquí: https://stackoverflow.com/a/23575424/3622198.

En algún lugar antes de que su bloque de código, sólo tiene que añadir lo siguiente:

from PIL import ImageFile 
ImageFile.LOAD_TRUNCATED_IMAGES = True 

... y usted debe ser bueno para ir!

EDIT: Parece que esto ayuda para la versión de PIL liado con la almohadilla ("PIP instalar almohada"), pero puede no funcionar para instalaciones predeterminadas de PIL

Cuestiones relacionadas