How do I read image data from a URL in Python?
当我们处理本地文件时,我想做的事情很简单,但是当我尝试使用远程URL来做时,问题就来了。
基本上,我试图从URL提取的文件中创建一个PIL图像对象。 当然,我总是可以仅获取URL并将其存储在临时文件中,然后将其打开到图像对象中,但这感觉效率很低。
这是我所拥有的:
1 | Image.open(urlopen(url)) |
抱怨
1 | Image.open(urlopen(url).read()) |
但这也不起作用。 有没有更好的方法可以做到这一点,还是可以将这种方式写入临时文件?
在Python3中,StringIO和cStringIO模块不见了。
在Python3中,您应该使用:
1 2 3 4 5 6 | from PIL import Image import requests from io import BytesIO response = requests.get(url) img = Image.open(BytesIO(response.content)) |
你可以尝试使用StringIO
1 2 3 4 | import urllib, cStringIO file = cStringIO.StringIO(urllib.urlopen(URL).read()) img = Image.open(file) |
我使用请求库。它似乎更强大。
1 2 3 4 5 6 | from PIL import Image import requests from StringIO import StringIO response = requests.get(url) img = Image.open(StringIO(response.content)) |
对于使用枕头的人,从2.8.0版开始,您可以:
1 2 3 4 | from PIL import Image import urllib2 im = Image.open(urllib2.urlopen(url)) |
或者,如果您使用
1 2 3 4 | from PIL import Image import requests im = Image.open(requests.get(url, stream=True).raw) |
参考文献:
- https://github.com/python-pillow/Pillow/pull/1151
- https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst#280-2015-04-01
使用
1 2 3 4 | from StringIO import StringIO import urllib Image.open(StringIO(urllib.requests.urlopen(url).read())) |
对于进行某些sklearn / numpy后处理(即深度学习)的用户,您可以使用np.array()包装PIL对象。这样可以避免您像我一样去过Google:
1 2 3 4 5 6 7 | 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))) |
Python 3
1 2 3 4 5 | from urllib.request import urlopen from PIL import Image img = Image.open(urlopen(url)) img |
Jupyter Notebook和IPython
1 2 3 | import IPython url = 'https://newevolutiondesigns.com/images/freebies/colorful-background-14.jpg' IPython.display.Image(url, width = 250) |
与其他方法不同,此方法还可以在for循环中使用!
如今,可以建议使用的图像输入/输出方法是使用专用软件包ImageIO。可以使用以下简单代码行直接从URL读取图像数据:
1 2 | from imageio import imread image = imread('https://cdn.sstatic.net/Sites/stackoverflow/img/logo.png') |
此页面上的许多答案早于该软件包的发布,因此没有提及。 ImageIO最初是Scikit-Image工具箱的组件。除了流行的图像处理库PILlow提供的格式外,它还支持多种科学格式。它将所有内容包装在仅关注图像输入/输出的干净API中。实际上,SciPy取消了自己的图像读取器/写入器,转而使用了ImageIO。
选择chrome中的图像,右键单击它,单击
1 2 3 4 5 6 7 8 | import shutil import requests my_url = 'https://www.washingtonian.com/wp-content/uploads/2017/06/6-30-17-goat-yoga-congressional-cemetery-1-994x559.jpg' response = requests.get(my_url, stream=True) with open('my_image.png', 'wb') as file: shutil.copyfileobj(response.raw, file) del response |
打开它;
1 2 3 4 | from PIL import Image img = Image.open('my_image.png') img.show() |