J'ai généré une image en utilisant PIL . Comment puis-je l'enregistrer dans une chaîne en mémoire? La Image.save()
méthode nécessite un fichier.
J'aimerais avoir plusieurs de ces images stockées dans le dictionnaire.
J'ai généré une image en utilisant PIL . Comment puis-je l'enregistrer dans une chaîne en mémoire? La Image.save()
méthode nécessite un fichier.
J'aimerais avoir plusieurs de ces images stockées dans le dictionnaire.
Vous pouvez utiliser la BytesIO
classe pour obtenir un wrapper autour des chaînes qui se comportent comme un fichier. L' BytesIO
objet fournit la même interface qu'un fichier, mais enregistre le contenu uniquement en mémoire:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
Vous devez spécifier explicitement le format de sortie avec le format
paramètre, sinon PIL générera une erreur lors de la tentative de détection automatique.
Si vous avez chargé l'image à partir d'un fichier, il a un format
paramètre qui contient le format de fichier d'origine, donc dans ce cas, vous pouvez utiliser format=image.format
.
Dans les anciennes versions de Python 2 avant l'introduction du io
module, vous auriez utilisé le StringIO
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 le deuxième argument, qui est le format (par exemple'PNG'
).from io import StringIO
image.save(output, format=image.format)
Pour Python3, il est nécessaire d'utiliser BytesIO:
En savoir plus: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
la source
La solution de qc n'a pas fonctionné pour moi
parce que dans ...
Il essayait de détecter le format à partir de l'extension dans le nom de fichier, qui n'existe pas dans le cas de StringIO
Vous pouvez contourner la détection de format en définissant vous-même le format dans un paramètre
la source
save()
peut prendre un objet semblable à un fichier ainsi qu'un chemin, vous pouvez donc utiliser un tampon en mémoire comme unStringIO
:la source
Avec modern (à partir de mi-2017 Python 3.5 et Pillow 4.0):
StringIO ne semble plus fonctionner comme avant. La classe BytesIO est le moyen approprié de gérer cela. La fonction de sauvegarde de Pillow attend une chaîne comme premier argument, et étonnamment ne voit pas StringIO en tant que tel. Ce qui suit est similaire aux anciennes solutions StringIO, mais avec BytesIO à sa place.
la source
Lorsque vous dites "J'aimerais avoir un certain nombre de ces images stockées dans le dictionnaire", il n'est pas clair s'il s'agit d'une structure en mémoire ou non.
Vous n'avez pas besoin de faire quoi que ce soit pour adoucir une image en mémoire. Gardez simplement l'
image
objet dans votre dictionnaire.Si vous allez écrire votre dictionnaire dans un fichier, vous voudrez peut-être regarder la
im.tostring()
méthode et laImage.fromstring()
fonctionhttp://effbot.org/imagingbook/image.htm
Le "format" (.jpeg, .png, etc.) n'a d'importance sur le disque que lorsque vous échangez les fichiers. Si vous n'échangez pas de fichiers, le format n'a pas d'importance.
la source