He generado una imagen usando PIL . ¿Cómo puedo guardarlo en una cadena en la memoria? El Image.save()
método requiere un archivo.
Me gustaría tener varias imágenes de este tipo almacenadas en el diccionario.
He generado una imagen usando PIL . ¿Cómo puedo guardarlo en una cadena en la memoria? El Image.save()
método requiere un archivo.
Me gustaría tener varias imágenes de este tipo almacenadas en el diccionario.
Puede usar la BytesIO
clase para obtener un contenedor alrededor de cadenas que se comporte como un archivo. El BytesIO
objeto proporciona la misma interfaz que un archivo, pero guarda el contenido solo en la memoria:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
Debe especificar explícitamente el formato de salida con el format
parámetro, de lo contrario, PIL generará un error al intentar detectarlo automáticamente.
Si cargó la imagen desde un archivo, tiene un format
parámetro que contiene el formato de archivo original, por lo que en este caso puede usar format=image.format
.
En las versiones antiguas de Python 2 antes de la introducción del io
módulo, habría utilizado el StringIO
módulo en su lugar.
You can use a file object instead of a filename. In this case, you must always specify the format.
Entonces, si el primer argumento es un objeto de archivo, debe pasar el segundo argumento, que es el formato (por ejemplo'PNG'
).from io import StringIO
image.save(output, format=image.format)
Para Python3, es necesario utilizar BytesIO:
Leer más: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
fuente
La solución de sth no funcionó para mí
porque en ...
Intentaba detectar el formato de la extensión en el nombre del archivo, que no existe en el caso de StringIO
Puede omitir la detección de formato configurando el formato usted mismo en un parámetro
fuente
save()
puede tomar un objeto similar a un archivo, así como una ruta, por lo que puede usar un búfer en memoria comoStringIO
:fuente
Con moderno (desde mediados de 2017 Python 3.5 y Pillow 4.0):
StringIO ya no parece funcionar como solía hacerlo. La clase BytesIO es la forma correcta de manejar esto. La función de guardar de Pillow espera una cadena como primer argumento y, sorprendentemente, no ve a StringIO como tal. Lo siguiente es similar a las soluciones StringIO más antiguas, pero con BytesIO en su lugar.
fuente
Cuando dice "Me gustaría tener un número de esas imágenes almacenadas en el diccionario", no está claro si se trata de una estructura en memoria o no.
No necesitas hacer nada de esto para guardar una imagen en la memoria. Simplemente mantenga el
image
objeto en su diccionario.Si va a escribir su diccionario en un archivo, es posible que desee ver el
im.tostring()
método y laImage.fromstring()
funciónhttp://effbot.org/imagingbook/image.htm
El "formato" (.jpeg, .png, etc.) sólo importa en el disco cuando intercambia los archivos. Si no intercambia archivos, el formato no importa.
fuente