Python PIL:如何将PNG图像写入字符串

时间:2009-03-14 17:15:18

标签: python python-imaging-library

我使用PIL生成了一张图片。如何将其保存到内存中的字符串? Image.save()方法需要一个文件。

我想将几张这样的图像存储在字典中。

6 个答案:

答案 0 :(得分:169)

您可以使用BytesIO类来获取行为类似于文件的字符串的包装器。 BytesIO对象提供与文件相同的接口,但将内容保存在内存中:

import io

with io.BytesIO() as output:
    image.save(output, format="GIF")
    contents = output.getvalue()

您必须使用format参数显式指定输出格式,否则PIL会在尝试自动检测时引发错误。

如果您从文件加载图像,则其中包含format参数,其中包含原始文件格式,因此在这种情况下,您可以使用format=image.format

在引入io模块之前的旧Python 2版本中,您将使用StringIO模块。

答案 1 :(得分:26)

对于Python3,需要使用BytesIO:

from io import BytesIO
from PIL import Image, ImageDraw

image = Image.new("RGB", (300, 50))
draw = ImageDraw.Draw(image)
draw.text((0, 0), "This text is drawn on image")

byte_io = BytesIO()

image.save(byte_io, 'PNG')

了解详情:http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image

答案 2 :(得分:24)

某事的解决方案对我不起作用 因为...

  

成像/ PIL / Image.pyc行1423 - >   提出KeyError(ext)#未知   扩展

它试图检测文件名中扩展名的格式,这在StringIO case

中是不存在的

您可以通过在参数

中自行设置格式来绕过格式检测
import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()

答案 3 :(得分:13)

save()可以获取类似文件的对象和路径,因此您可以像StringIO一样使用内存缓冲区:

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

答案 4 :(得分:9)

使用现代版(截至2017年中期的Python 3.5和Pillow 4.0):

StringIO似乎不再像过去那样工作了。 BytesIO类是处理此问题的正确方法。 Pillow的save函数需要一个字符串作为第一个参数,并且令人惊讶地看不到StringIO。以下类似于较旧的StringIO解决方案,但使用BytesIO。

from io import BytesIO
from PIL import Image

image = Image.open("a_file.png")
faux_file = BytesIO()
image_data = faux_file.getvalue()
image.save(faux_file, 'png')

答案 5 :(得分:8)

如果你说“我想将这些图像存储在字典中”,那么目前尚不清楚这是否是内存结构。

您无需执行任何操作即可在内存中粘贴图像。只需将image对象保留在字典中即可。

如果您要将字典写入文件,可能需要查看im.tostring()方法和Image.fromstring()函数

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

  

im.tostring()=>串

     

返回包含像素的字符串   数据,使用标准“原始”   编码器。

     

Image.fromstring(mode,size,data)=>   图像

     

从像素创建图像内存   使用标准的字符串中的数据   “原始”解码器。

“格式”(.jpeg,.png等)仅在您交换文件时在磁盘上很重要。如果您没有交换文件,格式无关紧要。