Encodage d'un fichier image avec base64
je veux encoder une image dans une chaîne en utilisant le module base64. J'ai couru dans un problème. Comment spécifier l'image que je veux encoder? J'ai essayé d'utiliser le répertoire à l'image, mais cela mène simplement au répertoire étant encodé. Je veux que le fichier image soit encodé.
MODIFIER
j'ai fatigué cet extrait:
with open("C:Python26seriph1.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 j'obtiens l'erreur suivante:
Traceback (most recent call last):
File "<string>", line 245, in run_nodebug
File "C:Python26GUI1.2.9.py", line 473, in <module>
app = simpleapp_tk(None)
File "C:Python26GUI1.2.9.py", line 14, in __init__
self.initialize()
File "C:Python26GUI1.2.9.py", line 431, in initialize
self.image = ImageTk.PhotoImage(Image.open(UUU))
File "C:Python26libsite-packagesPILImage.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?
4 réponses
Je ne suis pas sûr de comprendre votre question. Je suppose que vous faites quelque chose du genre:
import base64
with open("yourfile.ext", "rb") as image_file:
encoded_string = base64.b64encode(image_file.read())
vous devez ouvrir le fichier d'abord, bien sûr, et lire son contenu - Vous ne pouvez pas simplement passer le chemin à la fonction d'encodage.
Edit: Ok, voici une mise à jour après que vous ayez modifié votre question originale.
tout d'abord, n'oubliez pas d'utiliser des chaînes brutes (préfixer la chaîne avec 'r') lors de l'utilisation de délimiteurs de chemin sur Windows, pour éviter de frapper accidentellement un caractère escape. Deuxièmement, L'Image de PIL.open accepte soit un nom de fichier, soit un type de fichier (c'est-à-dire que l'objet doit fournir des méthodes de lecture, de recherche et de communication).
cela dit, vous pouvez utiliser cStringIO pour créer un tel objet à partir d'un tampon mémoire:
import cStringIO
import PIL.Image
# assume data contains your decoded image
file_like = cStringIO.StringIO(data)
img = PIL.Image.open(file_like)
img.show()
avec python 2.x, vous pouvez encoder trivialement en utilisant .code:
with open("path/to/file.png", "rb") as f:
data = f.read()
print data.encode("base64")
comme je l'ai dit dans votre question précédente, il n'est pas nécessaire de base64 Encoder la chaîne de caractères, cela ne fera que ralentir le programme. Il suffit d'utiliser le répertoire 151950920"
>>> 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))
...
maintenant l'image est stockée comme une variable appelée image_data
dans un fichier appelé image.py
Démarrer un nouvel interpréteur et importer l'image_data
>>> from image import image_data
>>>
empruntant à ce que Ivo van der Wijk et gnibbler ont développé plus tôt, c'est 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 rendre cool. Avec cette méthode, vous pouvez regrouper tous vos graphiques en un seul module.