从Internet获取图像,修改并在python中插入数据库

时间:2014-01-15 15:42:19

标签: python urllib2 mysql-python pillow

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

以下是代码的简化版本:

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)

2 个答案:

答案 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”

,这是公平的。