Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用PIL将PNG图像写入字符串?_Python_Python Imaging Library - Fatal编程技术网

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很好,没有任何用途。它是测试遗留下来的,最后被删除。