Python - 如何从URL读取图像?

con*_*raw 5 python

我是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)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

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

fur*_*ras 10

Image.open() 期望文件名或类文件对象 - 而不是文件数据.

你可以在本地写图像 - 即作为"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()
Run Code Online (Sandbox Code Playgroud)

或者您可以使用io模块在内存中创建类文件对象

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()
Run Code Online (Sandbox Code Playgroud)


ngu*_*b05 5

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

from skimage import io

io.imshow(io.imread("http://www.w3schools.com/css/trolltunga.jpg"))
io.show()
Run Code Online (Sandbox Code Playgroud)

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