如何从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)
参考文献: