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?

110
demandé sur Mirzhan Irkegulov 2010-09-15 11:24:48

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()
201
répondu Jim Brissom 2014-07-31 19:53:40

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")
49
répondu Ivo van der Wijk 2010-09-15 07:41:53

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
>>>
8
répondu John La Rooy 2010-09-15 08:06:02

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.

5
répondu iChux 2017-05-23 12:10:41