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.