recorrer - python leer imagenes
Python PIL: cómo escribir una imagen PNG en una cadena (6)
Con moderno (a 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 guardado de Pillow espera una cadena como primer argumento, y sorprendentemente no ve a StringIO como tal. Lo siguiente es similar a las soluciones anteriores de StringIO, pero con BytesIO en su lugar.
from io import BytesIO
from PIL import Image
image = Image.open("a_file.png")
faux_file = BytesIO()
image_data = faux_file.getvalue()
image.save(faux_file, ''png'')
He generado una imagen usando PIL . ¿Cómo puedo guardarlo en una cadena en la memoria? El método Image.save()
requiere un archivo.
Me gustaría tener varias de esas imágenes almacenadas en el diccionario.
Cuando dices "Me gustaría tener varias de esas imágenes almacenadas en el diccionario", no está claro si se trata de una estructura en memoria o no.
No necesita hacer nada de esto para moderar una imagen en la memoria. Solo mantén el objeto de image
en tu diccionario.
Si va a escribir su diccionario en un archivo, es posible que desee ver el método im.tostring()
y la función Image.fromstring()
http://effbot.org/imagingbook/image.htm
im.tostring () => cadena
Devuelve una cadena que contiene datos de píxeles, utilizando el codificador estándar "en bruto".
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 estándar "en bruto".
El "formato" (.jpeg, .png, etc.) solo importa en el disco cuando intercambia los archivos. Si no está intercambiando archivos, el formato no importa.
Para Python3, se requiere el uso de 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
Probablemente pueda usar la clase StringIO para obtener un contenedor de cadenas que se comporte como un archivo. El objeto StringIO proporciona la misma interfaz que un archivo, pero guarda los contenidos solo en la memoria:
try:
# python 2
from StringIO import StringIO
except ImportError:
# python 3
from io import StringIO
output = StringIO()
image.save(output)
contents = output.getvalue()
output.close()
Esto podría llevar a un KeyError
si PIL intenta detectar automáticamente el formato de salida. Para evitar este problema, puede especificar el formato manualmente:
image.save(output, format="GIF")
la solución de sth no funcionó para mí
porque en ...
Imaging / PIL / Image.pyc línea 1423 -> raise KeyError (ext) # extensión desconocida
Intentaba detectar el formato de la extensión en el nombre de archivo, que no existe en el caso de StringIO
Puede omitir la detección de formato estableciendo 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 un StringIO:
buf= StringIO.StringIO()
im.save(buf, format= ''JPEG'')
jpeg= buf.getvalue()