Eu gerei uma imagem usando PIL . Como posso salvá-lo em uma string na memória? O Image.save()
método requer um arquivo.
Eu gostaria de ter várias dessas imagens armazenadas no dicionário.
Eu gerei uma imagem usando PIL . Como posso salvá-lo em uma string na memória? O Image.save()
método requer um arquivo.
Eu gostaria de ter várias dessas imagens armazenadas no dicionário.
Você pode usar a BytesIO
classe para obter um invólucro em torno de strings que se comportam como um arquivo. O BytesIO
objeto fornece a mesma interface de um arquivo, mas salva o conteúdo apenas na memória:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
Você deve especificar explicitamente o formato de saída com o format
parâmetro, caso contrário, o PIL gerará um erro ao tentar detectá-lo automaticamente.
Se você carregou a imagem de um arquivo, ela possui um format
parâmetro que contém o formato do arquivo original, portanto, neste caso, você pode usar format=image.format
.
Nas versões antigas do Python 2, antes da introdução do io
módulo, você usaria o StringIO
módulo.
You can use a file object instead of a filename. In this case, you must always specify the format.
Portanto, se o primeiro argumento é um objeto de arquivo, você deve passar o segundo argumento, que é o formato (por exemplo'PNG'
).from io import StringIO
image.save(output, format=image.format)
Para Python3, é necessário usar BytesIO:
Leia mais: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
fonte
A solução do sth não funcionou para mim
porque em ...
Ele estava tentando detectar o formato da extensão no nome do arquivo, que não existe no caso StringIO
Você pode ignorar a detecção de formato definindo o formato por conta própria em um parâmetro
fonte
save()
pode pegar um objeto semelhante a um arquivo, bem como um caminho, então você pode usar um buffer na memória comoStringIO
:fonte
Com o moderno (em meados de 2017 Python 3.5 e Pillow 4.0):
StringIO parece não funcionar mais como antes. A classe BytesIO é a maneira adequada de lidar com isso. A função save de Pillow espera uma string como o primeiro argumento e, surpreendentemente, não vê StringIO como tal. O seguinte é semelhante a soluções StringIO mais antigas, mas com BytesIO em seu lugar.
fonte
Quando você diz "Eu gostaria de ter algumas dessas imagens armazenadas no dicionário", não fica claro se essa é uma estrutura na memória ou não.
Você não precisa fazer nada disso para suavizar uma imagem na memória. Basta manter o
image
objeto em seu dicionário.Se você vai escrever seu dicionário em um arquivo, pode querer olhar para o
im.tostring()
método e aImage.fromstring()
funçãohttp://effbot.org/imagingbook/image.htm
O "formato" (.jpeg, .png, etc.) só importa no disco quando você está trocando os arquivos. Se você não estiver trocando arquivos, o formato não importa.
fonte