Python PIL: comment écrire PNG image de la chaîne
J'ai généré une image à l'aide de PIL. Comment puis-je enregistrer une chaîne de caractères en mémoire?
Le Image.save()
méthode nécessite un fichier.
J'aimerais avoir plusieurs de ces images stockées dans le dictionnaire.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
BytesIO
classe pour obtenir un wrapper autour de chaînes de caractères qui se comporte comme un fichier. LeBytesIO
objet fournit la même interface qu'un fichier, mais enregistre le contenu juste en mémoire:Vous devez explicitement spécifier le format de sortie avec la
format
paramètre, sinon la LIP déclenchera une erreur en essayant de le détecte automatiquement.Si vous avez chargé l'image à partir d'un fichier qu'il a un
format
paramètre qui contient le format de fichier, dans ce cas, vous pouvez utiliserformat=image.format
.Dans le vieux Python 2 versions avant l'introduction de la
io
module que vous auriez utilisé leStringIO
module à la place.You can use a file object instead of a filename. In this case, you must always specify the format.
Donc, si le premier argument est un objet fichier, vous devez passer dans le deuxième argument, qui est le format (par exemple,'PNG'
).Image.open(theStringIObuffer)
avecPIL
, vous devez d'abord fairetheStringIObuffer.seek(0)
.from io import StringIO
image.save(output, format=image.format)
BytesIO
en Python 3? Essayez de fairefrom io import BytesIO as StringIO
à la place.io.BytesIO
pour toutes les versions.Pour Python3 il est nécessaire d'utiliser BytesIO:
Lire la suite: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
sth de la solution n'a pas fonctionné pour moi
parce que dans ...
Il a été d'essayer de détecter le format de l'extension dans le nom de fichier qui n'existe pas dans StringIO cas
Vous pouvez contourner la détection de format en définissant le format vous-même dans un paramètre
save() peut prendre un fichier objet en forme ainsi que d'un chemin, de sorte que vous pouvez utiliser un tampon en mémoire, comme un StringIO:
Moderne (à compter de la mi-2017 Python 3.5 et Oreiller 4.0):
StringIO ne semble plus fonctionner comme avant. Le BytesIO classe est la bonne façon de gérer cela. Oreiller d'enregistrement de la fonction attend une chaîne comme premier argument, et il est surprenant de ne pas voir StringIO en tant que tel. La suite est similaire à d'anciens StringIO solutions, mais avec BytesIO à sa place.
Quand vous dites "j'aimerais avoir le numéro de tel des images stockées dans un dictionnaire", il n'est pas clair si c'est une structure en mémoire ou non.
Vous n'avez pas besoin de faire tout cela à meek une image dans la mémoire. Il suffit de garder la
image
objet dans votre dictionnaire.Si vous allez écrire votre dictionnaire dans un fichier, vous voudrez peut-être regarder à
im.tostring()
méthode et laImage.fromstring()
fonctionhttp://effbot.org/imagingbook/image.htm
Le "format" (.jpeg, .png, etc.) seules les questions sur le disque lorsque vous échangez des fichiers. Si vous n'êtes pas l'échange de fichiers, le format n'a pas d'importance.