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

时间:2011-09-12 18:01:47

标签: python python-imaging-library

当我们处理本地文件时,我想要做的事情相当简单,但是当我尝试使用远程URL执行此操作时会出现问题。

基本上,我正在尝试从从URL中提取的文件创建PIL图像对象。当然,我总是可以获取URL并将其存储在临时文件中,然后将其打开到图像对象中,但效果非常低。

这就是我所拥有的:

Image.open(urlopen(url))

它宣称抱怨seek()不可用,所以我尝试了这个:

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

但这也不起作用。有没有更好的方法来做到这一点,或者写一个临时文件是接受的做这种事情的方式?

11 个答案:

答案 0 :(得分:202)

在Python3中,StringIO和cStringIO模块已经消失。

在Python3中你应该使用:

from PIL import Image
import requests
from io import BytesIO

response = requests.get(url)
img = Image.open(BytesIO(response.content))

答案 1 :(得分:167)

您可以尝试使用StringIO

import urllib, cStringIO

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

答案 2 :(得分:55)

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

from PIL import Image
import requests
from StringIO import StringIO

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

答案 3 :(得分:27)

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

from StringIO import StringIO
import urllib

Image.open(StringIO(urllib.requests.urlopen(url).read()))

答案 4 :(得分:21)

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

*a

答案 5 :(得分:9)

Python 3

from urllib.request import urlopen
from PIL import Image

img = Image.open(urlopen(url))
img

Jupyter Notebook和IPython

import IPython
url = 'https://newevolutiondesigns.com/images/freebies/colorful-background-14.jpg'
IPython.display.Image(url, width = 250)

与其他方法不同,该方法也可以在for循环中使用!

答案 6 :(得分:2)

选择chrome中的图片,右键单击该图片,点击Copy image address,将其粘贴到str变量(my_url)中以阅读图片:

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

打开它;

from PIL import Image

img = Image.open('my_image.png')
img.show()

答案 7 :(得分:1)

如今可以说是推荐的图像输入/输出方法是使用专用软件包ImageIO。只需简单的一行代码即可从URL直接读取图像数据:

from imageio import imread
image = imread('https://cdn.sstatic.net/Sites/stackoverflow/img/logo.png')

此页面上的许多答案早于该软件包的发布,因此没有提及。 ImageIO最初是Scikit-Image工具箱的组成部分。除了流行的图像处理库PILlow提供的格式外,它还支持多种科学格式。它将所有内容包装在仅关注图像输入/输出的干净API中。实际上,SciPy removed拥有自己的图像读取器/写入器in favor of ImageIO

答案 8 :(得分:1)

因为PIL> = 2.8.0,所以不再需要手动包装BytesIO。只需使用Image.open(response.raw)

在Vinícius的评论之上:

您应按照https://requests.readthedocs.io/en/master/user/quickstart/#raw-response-content的指示通过stream=True

所以

img = Image.open(requests.get(url, stream=True).raw)

答案 9 :(得分:0)

不使用PIL直接将图像获取为numpy数组

import requests, io
import matplotlib.pyplot as plt 

response = requests.get(url).content
img = plt.imread(io.BytesIO(response), format='JPG')
plt.imshow(img)

答案 10 :(得分:0)

使用urllib.request.urlretrieve()和PIL.Image.open()来下载和读取图像数据:

导入请求

导入urllib.request

import PIL
urllib.request.urlretrieve("https://i.imgur.com/ExdKOOz.png", "sample.png")
img = PIL.Image.open("sample.png")
img.show()

或使用URL作为目标文件的地址调用request.get(url)以通过GET请求下载。以obj作为响应的内容调用io.BytesIO(obj),以将原始数据加载为字节对象。要加载图像数据,请使用bytes_obj作为字节对象调用PIL.Image.open(bytes_obj):

import io
response = requests.get("https://i.imgur.com/ExdKOOz.png")
image_bytes = io.BytesIO(response.content)
img = PIL.Image.open(image_bytes)
img.show()