Python 如何使用PIL将PNG图像写入字符串?
我已经生成了一个图像使用。如何将其保存为内存中的字符串?Python 如何使用PIL将PNG图像写入字符串?,python,python-imaging-library,Python,Python Imaging Library,我已经生成了一个图像使用。如何将其保存为内存中的字符串? Image.save()方法需要一个文件 我希望有几个这样的图像存储在字典中。您可以使用该类来获取行为类似于文件的字符串的包装器。BytesIO对象提供与文件相同的接口,但只将内容保存在内存中: import io with io.BytesIO() as output: image.save(output, format="GIF") contents = output.getvalue() 您必须使用format参
Image.save()
方法需要一个文件
我希望有几个这样的图像存储在字典中。您可以使用该类来获取行为类似于文件的字符串的包装器。BytesIO
对象提供与文件相同的接口,但只将内容保存在内存中:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
您必须使用format
参数明确指定输出格式,否则PIL在尝试自动检测时将引发错误
如果从文件加载图像,则该图像具有一个包含原始文件格式的参数,因此在本例中,可以使用format=image.format
在引入io
模块之前的旧Python 2版本中,您可能会使用该模块。当您说“我希望在字典中存储大量这样的图像”时,不清楚这是否是内存中的结构
你不需要做任何这些来迎合记忆中的形象。只需将图像
对象保留在字典中即可
如果要将词典写入文件,可能需要查看im.tostring()
方法和Image.fromstring()
函数
im.tostring()=>字符串
返回包含像素的字符串
数据,使用标准“原始”
编码器
Image.fromstring(模式、大小、数据)=>
形象
从像素创建图像内存
字符串中的数据,使用标准
“原始”解码器
“格式”(.jpeg、.png等)仅在交换文件时在磁盘上起作用。如果您不交换文件,格式无关紧要。save()
可以采用类似文件的对象和路径,因此您可以使用类似于StringIO
的内存缓冲区:
buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()
sth的解决方案对我不起作用
因为在 Imaging/PIL/Image.pyc行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')
阅读更多信息:使用现代版(从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')
听起来他想保留PNG格式,而不是将其简化为原始像素数据。谢谢。StringIO-这正是我需要的。在获取PNG、JPEG或实际文件格式时,save()接口比tostring()接口干净得多。是的!这正是我想要的。我在谷歌上搜索了python、string、reader、writer和buffer的每一个组合,但没有找到任何结果。谢谢不适用于我:(我在Imaging/PIL/Image.pyc行1423->raisekeyerror(ext)#unknown中得到了这个键错误extension@Radian,save()上的PIL文档方法说明:
可以使用文件对象而不是文件名。在这种情况下,必须始终指定格式。
因此,如果第一个参数是文件对象,则必须传入第二个参数,即格式(例如'PNG'
)。在当前的Python版本中,StringIO在io包中,您必须编写:从io导入StringIO
您可以更好地使用image.save(output,format=image.format)
image\u data=faux\u file.getvalue()的用途是什么?@Ryan很好,没有任何用途。它是测试遗留下来的,最后被删除。