python PIL图像如何将图像保存到缓冲区以便以后使用?
我有一个python PIL图像如何将图像保存到缓冲区以便以后使用?,python,io,gridfs,stringio,Python,Io,Gridfs,Stringio,我有一个png文件,应该转换成jpg并保存到gridfs,我使用python的PILlib加载文件并进行转换工作,问题是我想将转换后的图像存储到MongoDB gridfs,在保存过程中,我不能只使用im.save()方法。因此,我使用StringIO来保存临时文件,但它不起作用 以下是代码片段: #!/usr/bin/env python # -*- coding: utf-8 -*- from PIL import Image from pymongo import MongoClient
png
文件,应该转换成jpg
并保存到gridfs
,我使用python的PIL
lib加载文件并进行转换工作,问题是我想将转换后的图像存储到MongoDB gridfs,在保存过程中,我不能只使用im.save()
方法。因此,我使用StringIO
来保存临时文件,但它不起作用
以下是代码片段:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PIL import Image
from pymongo import MongoClient
import gridfs
from StringIO import StringIO
im = Image.open("test.png").convert("RGB")
#this is what I tried, define a
#fake_file with StringIO that stored the image temporarily.
fake_file = StringIO()
im.save(fake_file,"jpeg")
fs = gridfs.GridFS(MongoClient("localhost").stroage)
with fs.new_file(filename="test.png") as fp:
# this will not work
fp.write(fake_file.read())
# vim:ai:et:sts=4:sw=4:
我对python的IO
机制非常熟悉,如何使其工作?使用而不是读取
:
with fs.new_file(filename="test.png") as fp:
fp.write(fake_file.getvalue())
或者,您可以使用if从StringIO的开头开始阅读
with fs.new_file(filename="test.png") as fp:
fake_file.seek(0)
fp.write(fake_file.read())
谢谢,这很有效,但是为什么我要先
seek(0)
才能read()
工作呢?这很让人困惑,也很奇怪。我在《我在哪里可以了解更多关于StringIO
的read()
方法的行为?StringIO
的read()方法的行为?StringIO
被明确设计为类似于文件。您刚刚完成对“文件”的写入,因此文件指针位于“文件”的末尾。所以阅读不会得到任何东西,因为你在“文件”的末尾。这就是为什么你必须seek(0)
来阅读它。因为它就像一个文件。“它的工作原理与您期望的一样”。@armnotstrong:链接中的第二句话。在这里,您可以找到与文件对象共享的所有方法StringIO
。@unutbu+1用于.seek(0)
提示。对我来说,需要用PIL做Image.open(假文件)