es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

almohada: imagen a bytes a imagen

Mi función acepta bytes para abrirlos internamente como un objeto PIL.Image. La función funciona como se espera cuando se le pasan bytes. Pero me gustaría escribir un par de pruebas para ella. Así que necesito generar imágenes, convertirlas en bytes y pasarlas a mi función para que pueda convertirlas nuevamente en una imagen.

Básicamente, quiero hacer algo como esto:

from PIL import Image
from io import BytesIO

orig = Image.new(mode='RGBA', size=(240, 60))
image_bytes = orig.tobytes()
stream = BytesIO(image_bytes)
new = Image.open(stream)

Pero lo que no entiendo es que no está funcionando y obtengo este mensaje de error:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Users/crane/PycharmProjects/my_project/venv/lib/python3.9/site-packages/PIL/Image.py", line 3030, in open
raise UnidentifiedImageError(
PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x104f86950>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que está intentando abrir la secuencia de bytes como una imagen sin especificar el formato de la imagen. La biblioteca PIL necesita conocer el formato de la imagen para poder abrirla correctamente.

    Para solucionar este problema, podemos especificar el formato de la imagen como un parámetro de la función “open”. Por ejemplo, si la imagen está en formato PNG, podemos modificar el código de la siguiente manera:

    from PIL import Image
    from io import BytesIO
    
    orig = Image.new(mode='RGBA', size=(240, 60))
    image_bytes = orig.tobytes()
    
    # Especificar el formato de la imagen como PNG
    stream = BytesIO(image_bytes)
    stream.seek(0)
    new = Image.open(stream, format='PNG')
    

    Ten en cuenta que necesitamos buscar al inicio de la secuencia antes de abrir la imagen. Esto se debe a que el método “tobytes” devuelve los bytes de los datos de la imagen, que comienzan después de la información del encabezado. Al buscar al inicio de la secuencia, nos aseguramos de que la información del encabezado no se omita.

    Con esta modificación, deberíamos poder generar imágenes, convertirlas en bytes y pasarlas a la función para su prueba.

Comments are closed.