Python - 如何从 URL 读取图像?

新手上路,请多包涵

我是 Python 的新手,我正在尝试弄清楚如何从 URL 读取图像。

这是我当前的代码:

 from PIL import Image
import urllib.request, io

URL = 'http://www.w3schools.com/css/trolltunga.jpg'

with urllib.request.urlopen(URL) as url:
    s = url.read()
    Image.open(s)

我收到以下错误:

 C:\python>python image.py
Traceback (most recent call last):
  File "image.py", line 8, in <module>
    Image.open(s)
  File "C:\Anaconda3\lib\site-packages\PIL\Image.py", line 2272, in open
    fp = builtins.open(filename, "rb")
ValueError: embedded null byte

我不知道这意味着什么。我究竟做错了什么?

原文由 connoraw 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 797
2 个回答

Image.open() 期望 filenamefile-like object 不是 file data

您可以在本地写入图像 - 即 "temp.jpg" - 然后打开它

from PIL import Image
import urllib.request

URL = 'http://www.w3schools.com/css/trolltunga.jpg'

with urllib.request.urlopen(URL) as url:
    with open('temp.jpg', 'wb') as f:
        f.write(url.read())

img = Image.open('temp.jpg')

img.show()

或者您可以使用 io 模块在内存中创建 file-like object

 from PIL import Image
import urllib.request
import io

URL = 'http://www.w3schools.com/css/trolltunga.jpg'

with urllib.request.urlopen(URL) as url:
    f = io.BytesIO(url.read())

img = Image.open(f)

img.show()


编辑:2022

Because urlopen() also gives file-like object so you can even skip io and use directly url (without .read() ) in Image.open()

 from PIL import Image
import urllib.request

URL = 'http://www.w3schools.com/css/trolltunga.jpg'

with urllib.request.urlopen(URL) as url:
    img = Image.open(url)
    img.show()

原文由 furas 发布,翻译遵循 CC BY-SA 4.0 许可协议

以下是使用 scikit-image 从 URL 读取图像的方法

from skimage import io

io.imshow(io.imread("http://www.w3schools.com/css/trolltunga.jpg"))
io.show()


注意: io.imread() 返回一个 numpy 数组

原文由 ngub05 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题