从URL(Python)检索JPG图片

时间:2012-09-14 17:12:34

标签: python python-imaging-library urllib3

我正在尝试使用以下Python代码从http ULRs中检索JPG图像(以在GUI中显示它们):

import urllib3
from cStringIO import StringIO
from PIL import Image

conn = urllib3.connection_from_url('http://www.solarspace.co.uk/')
img_file = conn.urlopen('GET', 'http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg')
image = StringIO(img_file.read())
image.seek(0)
resized_image = Image.open(image)

但是,这给了我这个错误消息:“IOError:无法识别图像文件”。

我使用urllib3的原因是因为我需要持久连接(发送多个请求),而urllib / urllib2不提供这种连接。

提前致谢。

3 个答案:

答案 0 :(得分:2)

一如既往,requests救援:

>>> r = requests.get('http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg')
>>> i = Image.open(StringIO.StringIO(r.content))
>>> i.size
(262, 299)

答案 1 :(得分:1)

如果您使用img_file.data而不是img_file.read(),似乎可以正常工作。当您在请求中指定img_file.read()时,将使用preload_content=False。现在我考虑一下,它不是很直观,也许img_file.read()应该知道缓存的预加载内容,或者如果它已经被消耗,它可能会引发异常。计划是使preload_content=False默认,但结果是有很多边缘情况属于正常使用情况,难以满足。我在未来开了一个bug来解决这个问题:https://github.com/shazow/urllib3/issues/102

无论如何,使用img_file.data应该可以解决您的问题。对困惑感到抱歉! :)

另外,我建议使用conn.request(...)代替低级conn.urlopen(...),如果你可能会跨域使用PoolManager(没有理由不使用它,真的) 。试试这个:

>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg')
>>> resized_image = Image.open(StringIO(r.data))

答案 2 :(得分:0)

保存时,您可以执行以下操作:

with open('##.jpg','wb') as fout:
     fout.write(r.content)