Respuestas:
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:
from io import BytesIO
from PIL import Image, ImageDraw
image = Image.new("RGB", (300, 50))
draw = ImageDraw.Draw(image)
draw.text((0, 0), "This text is drawn on image")
byte_io = BytesIO()
image.save(byte_io, 'PNG')
Leer más: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
La solución de sth no funcionó para mí
porque en ...
Imaging / PIL / Image.pyc línea 1423 -> subir KeyError (ext) # extensión desconocida
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
import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()
save()
puede tomar un objeto similar a un archivo, así como una ruta, por lo que puede usar un búfer en memoria como StringIO
:
buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()
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.
from io import BytesIO
from PIL import Image
image = Image.open("a_file.png")
faux_file = BytesIO()
image.save(faux_file, 'png')
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 la Image.fromstring()
función
http://effbot.org/imagingbook/image.htm
im.tostring () => cadena
Devuelve una cadena que contiene datos de píxeles, utilizando el codificador "crudo" estándar.
Image.fromstring (modo, tamaño, datos) => imagen
Crea una memoria de imagen a partir de datos de píxeles en una cadena, utilizando el decodificador "crudo" estándar.
El "formato" (.jpeg, .png, etc.) sólo importa en el disco cuando intercambia los archivos. Si no intercambia archivos, el formato no importa.