uso una texto separar que por eliminar descomponer declarar contar comparar caracteres caracter cadenas cadena python string image sockets

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) .