3

我正在尝试将图像从一个网页保存到另一个网页的数据库中。

这是代码的精简版本:

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 压缩的。

更新了彼得的代码

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

2 回答 2

2

文档提出了各种方法,其中最简单的可能是将您的字符串变成一个看起来像文件的东西:

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()
于 2014-01-15T17:58:00.047 回答
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")

在这个例子中,假设您可以只使用解析器并将您的“字符串”传递给它就足够公平了

于 2014-01-15T18:02:40.773 回答