112 votes

Python PIL: comment écrire PNG image de la chaîne

J'ai généré une image à l'aide du DIP. Comment puis-je enregistrer une chaîne de caractères en mémoire? L' Image.save() méthode nécessite un fichier.

J'aimerais avoir plusieurs de ces images stockées dans le dictionnaire.

208voto

sth Points 91594

Vous pouvez probablement utiliser la StringIO classe pour obtenir un wrapper autour de chaînes de caractères qui se comporte comme un fichier. Le StringIO objet fournit la même interface qu'un fichier, mais enregistre le contenu juste en mémoire:

import StringIO

output = StringIO.StringIO()
image.save(output)
contents = output.getvalue()
output.close()

Cela pourrait conduire à un KeyError si PIL essaie de détecter automatiquement le format de sortie. Pour éviter ce problème, vous pouvez spécifier le format manuellement:

image.save(output, format="GIF")

25voto

Radian Points 1092

sth solution ne fonctionne pas pour moi
parce que dans ...

Imagerie/PIL/Image.pyc ligne 1423 -> soulever KeyError(ext) # inconnu extension

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

import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()

15voto

bobince Points 270740

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:

buf= StringIO.StringIO()
im.save(buf, format= 'JPEG')
jpeg= buf.getvalue()

9voto

S.Lott Points 207588

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 à l' image objet dans votre dictionnaire.

Si vous allez écrire votre dictionnaire dans un fichier, vous voudrez peut-être regarder à l' im.tostring() méthode et l' Image.fromstring() fonction

http://effbot.org/imagingbook/image.htm

im.tostring() => string

Renvoie une chaîne contenant le pixel de données, en utilisant la norme "raw" codeur.

Image.fromstring(mode, la taille des données) => image

Crée une image de la mémoire de pixel des données dans une chaîne, à l'aide de la norme "raw" décodeur.

Le "format" (.jpeg, de .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.

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