如何写 PNG 图像字符串与 PIL?

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

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

132017 次浏览

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

import io


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

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

如果您从一个文件中加载了图像,那么它有一个包含原始文件格式的 format属性,因此在这种情况下您可以使用 format=image.format

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

当你说“我希望在字典中存储大量这样的图像”时,并不清楚这是否是一个内存结构。

你不需要做任何这些来满足记忆中的一个图像。只要在字典中保留 image对象。

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

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

Tostring () = > string

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

FROM string (mode,size,data) = > 形象

从像素创建图像内存 字符串中的数据,使用标准的 "raw" decoder.

The "format" (.jpeg, .png, etc.) only matters on disk when you are exchanging the files. If you're not exchanging files, format doesn't matter.

save() can take a file-like object as well as a path, so you can use an in-memory buffer like a StringIO:

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

某事物的解决办法对我不起作用
因为在..。

图像/PIL/图像.pyc 行1423-> 提高 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()

对于 Python 3,需要使用 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')

Read more: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image

使用 Modern (截至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.save(faux_file, 'png')