250 votes

Encodage d'un fichier image avec base64

Je veux encoder une image dans une chaîne de caractères en utilisant le module base64. Je me heurte cependant à un problème. Comment puis-je spécifier l'image que je veux encoder ? J'ai essayé d'utiliser le répertoire de l'image, mais cela conduit simplement à l'encodage du répertoire. Je veux que le fichier image réel soit encodé.

EDIT

J'ai essayé cet extrait :

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

mais je reçois l'erreur suivante :

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'est-ce que je fais de mal ?

11voto

nwaomachux Points 570

Emprunter à quoi Ivo van der Wijk y gnibbler développés précédemment, il s'agit d'une solution dynamique

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

Vous pouvez alors décider de compiler le fichier image de sortie avec Cython pour le faire refroidir. Avec cette méthode, vous pouvez regrouper tous vos graphiques dans un seul module.

7voto

Son travail pour moi

import base64
import requests

# Getting image in bytes
response = requests.get("image_url") 

# image encoding
encoded_image = base64.b64encode(response.content)

# image decoding and without it's won't work due to some '\xff' error
decoded_image= base64.b64decode(encoded_image)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X