2009-03-14 18 views

Respuesta

150

Probablemente pueda utilizar 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 el contenido 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 conducir a una KeyError si PIL intenta detectar automáticamente el formato de salida. Para evitar este problema, puede especificar el formato de manual:

image.save(output, format="GIF") 
+1

Sí! Esto es exactamente lo que estaba buscando. Busqué en Google todas las combinaciones de pitón, cadena, lector, escritor, búfer y no se me ocurrió nada. ¡Gracias! –

+0

Gracias - me salvó la cabeza esta mañana. –

+2

No funciona para mí :( Recibí este KeyError en Imaging/PIL/Image.pyc línea 1423 -> raise KeyError (ext) # extensión desconocida – Radian

7

Cuando dice "Me gustaría tener número de tales 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 mejorar una imagen en la memoria. Simplemente guarde el objeto image en su diccionario.

Si va a escribir su diccionario en un archivo, es posible que desee ver en im.tostring() método y la función Image.fromstring()

http://effbot.org/imagingbook/image.htm

im.tostring() => string

Devuelve una cadena que contiene los datos del píxel , utilizando el codificador estándar "en bruto" .

Image.fromstring (modo, el tamaño, datos) => imagen

Crea una memoria de imagen de pixel datos en una cadena, usando el estándar decodificador "en bruto".

El "formato" (.jpeg, .png, etc.) solo importa en el disco cuando se intercambian los archivos. Si no está intercambiando archivos, el formato no importa.

+2

Parece que quiere conservar el formato PNG, no reducirlo a datos de píxel sin procesar. –

10

save() puede tomar un objeto de tipo fichero, así como un camino, para que pueda utilizar un buffer en memoria como un StringIO:

buf= StringIO.StringIO() 
im.save(buf, format= 'JPEG') 
jpeg= buf.getvalue() 
+0

Gracias. StringIO - eso es lo que necesito. – maxp

+0

La interfaz save() es mucho más limpia que la interfaz tostring() cuando se trata de obtener un PNG, JPEG o formato de archivo real. – Kekoa

22

solución de algo no funcionó para mí
porque en ...

Imagen/PIL/Imagen.línea de PYC 1423 -> aumento KeyError (ext) # desconocida extensión

Se estaba tratando de detectar el formato de la extensión del nombre de archivo, que no existe en el caso StringIO

puede omitir la detección formato ajustando el formato de sí 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() 
+0

¡Gracias! Esto lo hizo por mí –

20

para python3 que es necesario para 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

1

Con moderna (a partir de mediados de 2017 Python 3.5 y 4.0 almohada):

StringIO ya no parece funcionar como antes. 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') 
Cuestiones relacionadas