首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从URL检索JPG图片(Python)

从URL检索JPG图片(Python)
EN

Stack Overflow用户
提问于 2012-09-15 01:12:34
回答 3查看 9.1K关注 0票数 1

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

代码语言:javascript
复制
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中是不可用的。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-15 02:13:28

如果您使用img_file.data而不是img_file.read(),似乎可以工作。当您在请求上指定preload_content=False时,将使用img_file.read()。现在我想起来,它不是很直观,也许img_file.read()应该知道缓存的预加载内容,或者如果它已经被使用了,它可能应该引发一个异常。我们的计划是让preload_content=False成为默认的,但事实证明,有很多边缘情况属于正常使用,很难满足。我打开了一个bug来在将来修复这个问题:https://github.com/shazow/urllib3/issues/102

无论如何,使用img_file.data应该可以解决您的问题。很抱歉给您造成了混乱!:)

此外,我建议使用conn.request(...)而不是低级的conn.urlopen(...),如果您可能要跨域,则可以使用PoolManager (实际上,没有理由不使用它)。试试这个:

代码语言:javascript
复制
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg')
>>> resized_image = Image.open(StringIO(r.data))
票数 1
EN

Stack Overflow用户

发布于 2012-09-15 01:50:21

一如既往,requests拯救了我们:

代码语言:javascript
复制
>>> r = requests.get('http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg')
>>> i = Image.open(StringIO.StringIO(r.content))
>>> i.size
(262, 299)
票数 2
EN

Stack Overflow用户

发布于 2013-07-07 17:28:41

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

代码语言:javascript
复制
with open('##.jpg','wb') as fout:
     fout.write(r.content)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12429088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档