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')