1

我正在尝试使用以下 Python 代码从 http ULR 中检索 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 则没有。

提前致谢。

4

3 回答 3

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)
于 2012-09-14T17:50:21.240 回答
1

如果您使用img_file.data而不是img_file.read(). 应在您在请求中img_file.read()指定时使用。preload_content=False现在我想起来,它不是很直观,也许img_file.read()应该知道缓存的预加载内容,或者如果它已经被消费,它应该引发异常。计划是preload_content=False默认设置,但事实证明有很多边缘情况属于正常使用情况,很难满足。我打开了一个错误来解决这个问题:https ://github.com/shazow/urllib3/issues/102

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

此外,我建议使用conn.request(...)而不是 lower-level 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))
于 2012-09-14T18:13:27.617 回答
0

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

with open('##.jpg','wb') as fout:
     fout.write(r.content)
于 2013-07-07T09:28:41.480 回答