我正在尝试使用以下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中是不可用的。
提前谢谢。
发布于 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 (实际上,没有理由不使用它)。试试这个:
>>> 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-15 01:50:21
一如既往,requests拯救了我们:
>>> r = requests.get('http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg')
>>> i = Image.open(StringIO.StringIO(r.content))
>>> i.size
(262, 299)发布于 2013-07-07 17:28:41
保存时,可以执行以下操作:
with open('##.jpg','wb') as fout:
fout.write(r.content)https://stackoverflow.com/questions/12429088
复制相似问题