2012-04-12 16 views
9

¿Cómo puedo crear un archivo seleccionable de un objeto de imagen PIL de modo que pueda guardar esas imágenes como un único archivo de salmuera y luego cargarlo a otro equipo como un servidor que ejecuta PIL y desenfundarlo allí?Objeto de imagen seleccionable

Respuesta

16

Puede convertir el objeto de imagen en datos entonces se puede conservar en vinagre que:

image = { 
    'pixels': im.tostring(), 
    'size': im.size, 
    'mode': im.mode, 
} 

Y de vuelta a una imagen:

im = Image.fromstring(image['mode'], image['size'], image['pixels']) 

NOTA:astex Como se ha mencionado, si estás utilizando Pillow (que se recomienda en lugar de PIL), el método tostring() está en desuso para tobytes(). Del mismo modo con fromstring() para frombytes().

+1

'Image.tostring() 'ahora está en desuso n 'Pillow' a favor de' Image.tobytes() '. Por el bien de la posteridad, puede ser mejor cambiar lo anterior (o al menos dejar una nota). – astex

9

Una pequeña variación de la respuesta de Gerald usando argumentos de palabras clave

crear el objeto pickleable

image = {'data': im.tostring(), 'size':im.size, 'mode':im.mode} 

o

image = dict(data=im.tostring(), size=im.size, mode=im.mode) 

unpickle de nuevo a la imagen

im = Image.fromstring(**image) 
+0

¿Esto significa que no necesito almacenar imágenes en mi aplicación? ¿Puedo usar la cadena a la que se serializan y simplemente codificarla dentro de la aplicación cuando quiero usar la imagen? – Ogen

+0

Técnicamente * podría * hacer eso, pero es mucho mejor mantenerlo como un archivo real ... en ambos casos puede ser versionado junto con su código, pero tener imágenes guardadas como imágenes significa que puede verlas fácilmente y saber qué medios que ha almacenado. Si está almacenando imágenes como código, está inflando artificialmente el tamaño de sus archivos fuente, haciéndolos más onerosos para ver y buscar, y haciendo que sus medios sean mucho más difíciles de administrar si desea ver y/o cambiar esa imagen. – kungphu

Cuestiones relacionadas