2016-12-01 106 views
2

我對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 

我不知道任何這意味着什麼。我究竟做錯了什麼?

+2

'的open()'預計,文件名,而不是數據 - 所以你必須在本地寫圖像,然後打開它 - 'Image.open( 'temp.jpg')' 。或者使用io.BytesIO在內存中創建文件對象。 – furas

+1

一旦閱讀完圖像,你想怎麼做? –

回答

2

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() 

,也可以使用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() 
0

首先,您可以將圖像下載到您當前的工作目錄第一

from urllib.request import urlretrieve 

url = 'http://www.w3schools.com/css/trolltunga.jpg' 
urlretrieve(url, 'pic.jpg') 

,然後打開/本地閱讀:

from PIL import Image 
img = Image.open('pic.jpg') 

# For example, check image size and format 
print(img.size) 
print(img.format) 

img.show() 
0

this stack overflow answer建議,你可以這樣做像這樣:

import urllib, cStringIO 
from PIL import Image 

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

然後你可以自由使用你的圖片。 例如,可以將其轉換爲一個numpy的數組:

img_npy = np.array(img) 
2

下面是如何讀取在內存中創建文件對象使用從URL圖像scikit-image

from skimage import io 

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

注:io.imread()返回numpy的陣列