我正在尝试将图像从一个网页保存到另一个网页的数据库中。
以下是代码的简化版本:
POSTER_SIZE = (200, 310)
LargePoster = urllib2.urlopen(PosterURL).read()
SmallPoster = LargePoster.resize(POSTER_SIZE, Image.ANTIALIAS)
conn = MySQLdb.connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, charset='utf8')
cur = conn()
cur.execute("UPDATE `table` SET `poster`=%s WHERE `id`=%d", (SmallPoster, ID))
cur.close()
注意: 我不想保持宽高比,所以不要建议Image.thumbnail()
,除非它可以延长它。
如您所见,我使用urlopen()
和read()
检索图像,但它返回一个字符串。我需要这个字符串是Image类,所以我可以使用PIL / Pillow操作它,然后将它输出为字符串,以便我可以将它发送到数据库。
我知道所有图像都是用JPEG压缩的。
更新了Peter的代码
LargePosterString = urllib2.urlopen(MovieMeta['poster']).read()
LargePosterImage = Image.open(StringIO(LargePosterString))
SmallPosterImage = LargePosterImage.resize(POSTER_SIZE, Image.ANTIALIAS)
SmallPosterString = StringIO()
Format = 'JPEG'
SmallPosterImage.save(SmallPosterString.getvalue(), Format)
答案 0 :(得分:1)
docs提出了各种方法,其中最简单的方法可能是将您的字符串变成看起来像文件的东西:
from PIL import Image
from StringIO import StringIO
LargeData = urllib2.urlopen(PosterURL).read()
# read data from string
LargePoster = Image.open(StringIO(LargeData))
# After editing the image, turn it back into a string
# for saving in the database:
result = StringIO()
format = 'JPEG' # or whatever you want
SmallPoster.save(result, format)
SmallPosterString = result.getvalue()
答案 1 :(得分:1)
所以是的,你收到一个字符串,但你看过字符串内容了吗?你拥有的可能是包含文件内容的二进制字符串。您应该很容易将其重建为图像。事实上,您可以将该字符串(只要它被视为二进制)直接放入blob对象或类似物中,然后在呈现图像的任何内容中重建它。
将解析器类作为PIL ImageClass
这应该能够从流重建图像。只要你的字节是有效的图像字节(JPEG应该以JFIF标识符开头)。
import ImageFile
fp = open("lena.pgm", "rb")
p = ImageFile.Parser()
while 1:
s = fp.read(1024)
if not s:
break
p.feed(s)
im = p.close()
im.save("copy.jpg")
通过这个例子,假设您可以使用解析器并将其传递给“String”
,这是公平的。