我正在尝试使用以下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不提供这种连接。
提前致谢。
答案 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)