imagen encode64 decodificar convertir python base64

python - encode64 - Codificación de un archivo de imagen con base64



python base64 encode file (4)

Como dije en su pregunta anterior, no hay necesidad de codificar en base64 la cadena, solo hará que el programa sea más lento. Solo usa el repr

>>> with open("images/image.gif", "rb") as fin: ... image_data=fin.read() ... >>> with open("image.py","wb") as fout: ... fout.write("image_data="+repr(image_data)) ...

Ahora la imagen se almacena como una variable llamada image_data en un archivo llamado image.py Comience un nuevo intérprete e importe la image_data

>>> from image import image_data >>>

Quiero codificar una imagen en una cadena usando el módulo base64. Me encontré con un problema sin embargo. ¿Cómo especifico la imagen que quiero codificar? Intenté usar el directorio en la imagen, pero eso simplemente lleva al directorio que está siendo codificado. Quiero que el archivo de imagen real sea codificado.

EDITAR

Me cansé este fragmento:

with open("C:/Python26/seriph1.BMP", "rb") as f: data12 = f.read() UU = data12.encode("base64") UUU = base64.b64decode(UU) print UUU self.image = ImageTk.PhotoImage(Image.open(UUU))

pero me sale el siguiente error:

Traceback (most recent call last): File "<string>", line 245, in run_nodebug File "C:/Python26/GUI1.2.9.py", line 473, in <module> app = simpleapp_tk(None) File "C:/Python26/GUI1.2.9.py", line 14, in __init__ self.initialize() File "C:/Python26/GUI1.2.9.py", line 431, in initialize self.image = ImageTk.PhotoImage(Image.open(UUU)) File "C:/Python26/lib/site-packages/PIL/Image.py", line 1952, in open fp = __builtin__.open(fp, "rb") TypeError: file() argument 1 must be encoded string without NULL bytes, not str

¿Qué estoy haciendo mal?


Con python 2.x, puedes codificar trivialmente usando .encode:

with open("path/to/file.png", "rb") as f: data = f.read() print data.encode("base64")


No estoy seguro de entender tu pregunta. Supongo que estás haciendo algo como:

import base64 with open("yourfile.ext", "rb") as image_file: encoded_string = base64.b64encode(image_file.read())

Primero debe abrir el archivo y leer su contenido; no puede simplemente pasar la ruta a la función de codificación.

Editar: Ok, aquí hay una actualización después de que hayas editado tu pregunta original.

Antes que nada, recuerde usar cadenas sin formato (prefijar la cadena con ''r'') cuando use delimitadores de ruta en Windows, para evitar golpear accidentalmente un caracter de escape. En segundo lugar, Image.open de PIL acepta un nombre de archivo o un archivo (por ejemplo, el objeto debe proporcionar métodos de lectura, búsqueda y explicación).

Dicho esto, puede usar cStringIO para crear dicho objeto desde un búfer de memoria:

import cStringIO import PIL.Image # assume data contains your decoded image file_like = cStringIO.StringIO(data) img = PIL.Image.open(file_like) img.show()


Tomando prestado de lo que y gnibbler han desarrollado antes, esta es una solución dinámica

import cStringIO import PIL.Image image_data = None def imagetopy(image, output_file): with open(image, ''rb'') as fin: image_data = fin.read() with open(output_file, ''w'') as fout: fout.write(''image_data = ''+ repr(image_data)) def pytoimage(pyfile): pymodule = __import__(pyfile) img = PIL.Image.open(cStringIO.StringIO(pymodule.image_data)) img.show() if __name__ == ''__main__'': imagetopy(''spot.png'', ''wishes.py'') pytoimage(''wishes'')

A continuación, puede decidir compilar el archivo de imagen de salida con Cython para refrescarlo. Con este método, puede agrupar todos sus gráficos en un solo módulo.