Python PIL:如何将PNG图像写入string

我已经使用PIL生成了一个图像。 我怎样才能把它保存到内存中的string? Image.save()方法需要一个文件。

我想有几个这样的图像存储在字典中。

您可能可以使用StringIO类来获取一个包装文件的行为。 StringIO对象提供与文件相同的接口,但将内容保存在内存中:

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

如果PIL尝试自动检测输出格式,这可能会导致KeyError 。 为了避免这个问题,你可以手动指定格式:

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

某事的解决scheme对我不起作用
因为在…

Imaging / PIL / Image.pyc line 1423 – > raise KeyError(ext)#未知扩展名

它试图从文件名中检测扩展名中的格式,这在StringIO情况下是不存在的

您可以通过在参数中设置自己的格式来绕过格式检测

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

对于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

save()可以像文件一样的对象以及一个path,所以你可以使用像StringIO这样的内存缓冲区:

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

当你说“我想在字典中存储这样的图像的数量”时,不清楚这是否是内存结构。

你不需要做任何这样的内容来缓和图像。 只要保持你的字典中的image对象。

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

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

im.tostring()=>string

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

Image.fromstring(mode,size,data)=> image

使用标准的“原始”解码器从string中的像素数据创build图像存储器。

在交换文件时,“格式”(.jpeg,.png等)只对磁盘有影响。 如果你不交换文件,格式不重要。

随着现代(截至2017年中期的Python 3.5和枕头4.0):

StringIO不再像以前那样工作了。 BytesIO类是处理这个问题的正确方法。 Pillow的保存函数需要一个string作为第一个参数,而且令人惊讶的是,并没有看到StringIO。 以下内容与较旧的StringIO解决scheme类似,但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')