【问题标题】:Retrieve JPG pictures from URL (Python)从 URL 中检索 JPG 图片(Python)
【发布时间】:2012-09-14 17:12:33
【问题描述】:

我正在尝试使用以下 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: cannot identify image file”。

我使用 urllib3 的原因是因为我需要一个持久连接(发送多个请求),而 urllib/urllib2 则没有。

提前致谢。

【问题讨论】:

    标签: python python-imaging-library urllib3


    【解决方案1】:

    一如既往,requests 来救援:

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

    【讨论】:

    • 感谢r.content - 出于某种原因,我试图用r.text 来做这件事,因为它使它成为unicode,所以效果不佳
    【解决方案2】:

    如果您使用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))
    

    【讨论】:

    • 感谢您的详细回答。现在一切都很好。
    【解决方案3】:

    保存的时候可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2018-03-23
      • 2012-03-08
      • 1970-01-01
      • 2014-08-11
      • 2019-08-28
      • 2020-03-28
      相关资源
      最近更新 更多