如何从Python中的URL读取图像数据?

我正在处理的是一个本地文件时,我想要做的事情非常简单,但是当我尝试使用远程URL执行此操作时,问题就出现了。

基本上,我试图从一个URL从一个URL中创build一个PIL图像对象。 当然,我总是可以获取URL并将其存储在一个临时文件中,然后将其打开成一个图像对象,但是这样做效率很低。

这是我有:

Image.open(urlopen(url)) 

它发出抱怨seek()不可用,所以然后我试着这样做:

 Image.open(urlopen(url).read()) 

但是那也行不通。 有没有更好的方法来做到这一点,或者正在写一个临时文件的方式来做这种事情?

你可以尝试使用一个StringIO

 import urllib, cStringIO file = cStringIO.StringIO(urllib.urlopen(URL).read()) img = Image.open(file) 

在Python3中,StringIO和cStringIO模块不见了。

在Python3中,你应该使用:

 from PIL import Image import requests from io import BytesIO response = requests.get(url) img = Image.open(BytesIO(response.content)) 

我使用请求库。 它似乎更强大。

 from PIL import Image import requests from StringIO import StringIO response = requests.get(url) img = Image.open(StringIO(response.content)) 

使用StringIO将读取string转换为类似文件的对象:

 from StringIO import StringIO import urllib Image.open(StringIO(urllib.urlopen(url).read())) 

对于那些做sklearn / numpy后期处理(即深度学习)的人,你可以用np.array()包装PIL对象。 这样可以避免像我这样做Google:

 from PIL import Image import requests import numpy as np from StringIO import StringIO response = requests.get(url) img = np.array(Image.open(StringIO(response.content))) 

对于那些使用Pillow的人,从2.8.0版开始,您可以:

 from PIL import Image import urllib2 im = Image.open(urllib2.urlopen(url)) 

或者如果您使用requests

 from PIL import Image import requests im = Image.open(requests.get(url, stream=True).raw) 

参考文献: