PIL no puede identificar el archivo de imagen para el objeto io.BytesIO

Estoy usando la horquilla de almohada de PIL y sigo recibiendo el error

OSError: no se puede identificar el archivo de imagen

Al intentar abrir una imagen. Estoy usando virtualenv con python 3.4 y no tengo instalación de PIL.

He intentado encontrar una solución a esto en base a que otras personas encuentren el mismo problema, sin embargo, esas soluciones no funcionaron para mí. Aquí está mi código:

from PIL import Image import io # This portion is part of my test code byteImg = Image.open("some/location/to/a/file/in/my/directories.png").tobytes() # Non test code dataBytesIO = io.BytesIO(byteImg) Image.open(dataBytesIO) # <- Error here 

La imagen existe en la apertura inicial del archivo y se convierte a bytes. Esto parece funcionar para casi todos los demás, pero no puedo entender por qué me falla.

    EDITAR:

     dataBytesIO.seek(0) 

    no funciona como una solución (lo probé) ya que no estoy guardando la imagen a través de un flujo, solo estoy creando una instancia de BytesIO con datos, por lo tanto (si estoy pensando en esto correctamente) la búsqueda ya debería estar en 0.

    (Esta solución es del propio autor. Acabo de moverla aquí).

    SOLUCIÓN:

     # This portion is part of my test code byteImgIO = io.BytesIO() byteImg = Image.open("some/location/to/a/file/in/my/directories.png") byteImg.save(byteImgIO, "PNG") byteImgIO.seek(0) byteImg = byteImgIO.read() # Non test code dataBytesIO = io.BytesIO(byteImg) Image.open(dataBytesIO) 

    El problema estaba en la forma en que Image.tobytes() estaba devolviendo el objeto byte. Parecía que los datos no eran válidos y la “encoding” no podía ser otra cosa que los datos en bruto que aún parecían generar datos erróneos, ya que casi todos los bytes aparecían en el formato \xff\ . Sin embargo, guardar los bytes a través de BytesIO y usar la función .read .read() para leer la imagen completa proporcionó los bytes correctos que, de ser necesario, más tarde podrían usarse.

    En algunos casos, se produce el mismo error cuando se trata de un archivo de imagen sin procesar como CR2. Ejemplo: http://www.rawsamples.ch/raws/canon/g10/RAW_CANON_G10.CR2

    cuando intentas correr:

     byteImg = Image.open("RAW_CANON_G10.CR2") 

    Obtendrá este error:

     OSError: cannot identify image file 'RAW_CANON_G10.CR2' 

    Por lo tanto, primero debe convertir la imagen usando rawkit, aquí hay un ejemplo de cómo hacerlo:

     from io import BytesIO from PIL import Image, ImageFile import numpy from rawkit import raw def convert_cr2_to_jpg(raw_image): raw_image_process = raw.Raw(raw_image) buffered_image = numpy.array(raw_image_process.to_buffer()) if raw_image_process.metadata.orientation == 0: jpg_image_height = raw_image_process.metadata.height jpg_image_width = raw_image_process.metadata.width else: jpg_image_height = raw_image_process.metadata.width jpg_image_width = raw_image_process.metadata.height jpg_image = Image.frombytes('RGB', (jpg_image_width, jpg_image_height), buffered_image) return jpg_image byteImg = convert_cr2_to_jpg("RAW_CANON_G10.CR2") 

    Codifique el crédito si es para mateusz-michalik en GitHub ( https://github.com/mateusz-michalik/cr2-to-jpg/blob/master/cr2-to-jpg.py )

    Me sucedió cuando accidentalmente cargaba un PDF en lugar de PNG.