texto - Cómo crear una imagen desde una cadena en Python
que es una cadena de texto en python (2)
Sospecho que no está seek
volver al principio del búfer antes de pasar el objeto StringIO a PIL. Aquí hay un código que demuestra el problema y la solución:
>>> buff = StringIO.StringIO()
>>> buff.write(open(''map.png'', ''rb'').read())
>>>
>>> #seek back to the beginning so the whole thing will be read by PIL
>>> buff.seek(0)
>>>
>>> Image.open(buff)
<PngImagePlugin.PngImageFile instance at 0x00BD7DC8>
>>>
>>> #that worked.. but if we try again:
>>> Image.open(buff)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:/python25/lib/site-packages/pil-1.1.6-py2.5-win32.egg/Image.py", line 1916, in open
raise IOError("cannot identify image file")
IOError: cannot identify image file
Asegúrese de llamar a buff.seek(0)
antes de leer cualquier objeto StringIO. De lo contrario, estará leyendo desde el final del búfer, que se verá como un archivo vacío y es probable que cause el error que está viendo.
Actualmente tengo problemas para crear una imagen a partir de una cadena de datos binaria en mi programa Python. Recibo los datos binarios a través de un socket, pero cuando intento los métodos que leí here esta manera:
buff = StringIO.StringIO() #buffer where image is stored
#Then I concatenate data by doing a
buff.write(data) #the data from the socket
im = Image.open(buff)
Obtengo una excepción al efecto de "tipo de imagen no reconocido". Sé que estoy recibiendo los datos correctamente porque si escribo la imagen en un archivo y luego abro un archivo, funciona:
buff = StringIO.StringIO() #buffer where image is stored
buff.write(data) #data is from the socket
output = open("tmp.jpg", ''wb'')
output.write(buff)
output.close()
im = Image.open("tmp.jpg")
im.show()
Me imagino que probablemente estoy haciendo algo mal al usar la clase StringIO pero no estoy seguro
Tiene que llamar a buff.seek(0)
o, mejor, inicializar el búfer de memoria con datos StringIO.StringIO(data)
.