这是在 Python 3 中从 URL 获取图像的正确方法吗?

Is this the right way to fetch an image from a URL in Python 3?

提问人:JamesTheAwesomeDude 提问时间:3/16/2015 最后编辑:JamesTheAwesomeDude 更新时间:2/6/2022 访问量:1500

问:

我需要在 Python 中检索一个 URL 并将其作为 Pillow 图像获取。

from PIL import Image
from io import BytesIO
import urllib.request

url = input('Enter an image URL:\n> ')
r = urllib.request.urlopen(url)
imdata = r.read()
imdata_wrapper = BytesIO(imdata)
im = Image.open(imdata_wrapper)

im.show()

这似乎是一种相当迂回的方法(获取图像,将其数据读出到 blob 中,将所述 blob 转换为对象,然后最后打开图像)。BytesIO

有更好的方法吗?

python-3.x python 映像库 urllib

评论

0赞 Blckknght 3/16/2015
你不能跳过 和 调用吗?返回值 from 应该是所需的类文件对象类型。readBytesIOurllib.request.urlopenImage.open
0赞 JamesTheAwesomeDude 3/16/2015
@Blckknght我怀疑过这样的事情,但我找不到该怎么做。 返回一个似乎不能用于太多的“对象”。urllib.request.urlopen()http.client.HTTPResponse
1赞 Kevin 3/16/2015
@JamesTheAwesomeDude:当您尝试将对象直接传递给时,您会遇到什么错误?HTTPResponseImage.open
2赞 mata 3/16/2015
@JamesTheAwesomeDude - 需要一个支持 和 的文件对象,而后两个不支持,因此将其存储在 BytesIO 中是正确的做法。Image.openreadseektellhttp.client.HTTPResponse
1赞 Dave J 3/16/2015
文档指出:因此,您的解决方案似乎是预期的解决方案。:)If you have an entire image in a string, wrap it in a BytesIO object, and use open() to load it.

答:

2赞 JamesTheAwesomeDude 5/20/2021 #1

每条评论 -- 不;这就是文档甚至建议的!

如果 bytestring 中有整个映像,请将其包装在 BytesIO 对象中,然后使用 PIL。Image.open() 来加载它。


不过,从 Python 3.5 开始,即使这样也是不必要的,因为 HTTPResponse已经被缓冲了(这也适用于其他 URL 库,例如 和 ):requestsurllib3

from PIL import Image
import urllib.request

url = input('Enter an image URL:\n> ')

r = urllib.request.urlopen(url)
im = Image.open(r)

im.show()