2013-09-01 120 views
1

我試圖通過URL訪問圖像:PIL:從URL圖像,無法識別圖像文件

http://www.lifeasastrawberry.com/wp-content/uploads/2013/04/IMG_1191-1024x682.jpg

然而,失敗的IOError(「無法識別圖像文件」)的最後步。不知道發生了什麼或如何解決它。它與許多其他網址圖片一起工作。

opener = urllib2.build_opener() 
    opener.addheaders = [('User-agent', 'Mozilla/5.0')] 
    opener.addheaders = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')] 
    opener.addheaders = [('Accept-Encoding', 'gzip,deflate,sdch')] 

    response = opener.open(image_url,None,5) 
    img_file = cStringIO.StringIO(response.read()) 

    image = Image.open(img_file) 

這個網址也失敗:

http://www.canadianliving.com/img/photos/biz/Greek-Yogurt-Ceaser-Salad-Dressi1365783448.jpg

+0

它適用於我,如果我不將標題添加到'opener'。 –

回答

1

的問題是,你告訴你的URL獵犬,要求從服務器gzip編碼的結果,所以它的圖像數據你接收是gzip編碼的。你可以,或者通過手動解壓gzip壓縮的結果由要麼離開過您的請求accept-encoding頭解決這個問題:

from PIL import Image 
import urllib2 
import gzip 
import cStringIO 

opener = urllib2.build_opener() 
opener.addheaders = [('User-agent', 'Mozilla/5.0')] 
opener.addheaders = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')] 
opener.addheaders = [('Accept-Encoding', 'gzip,deflate,sdch')] 

gzipped_file = cStringIO.StringIO(opener.open(url, None, 5).read()) 
image = Image.open(gzip.GzipFile(fileobj=gzipped_file)) 

這種方法的問題是,如果你接受你的HTTP請求多種編碼,然後您需要查看結果的HTTP標頭以查看您實際獲得的編碼,然後根據該值指示的任何值手動解碼。

我認爲這是比較容易的編碼接受頭設置的值,這樣你將只接受一個編碼(例如,'identity;q=1, *;q=0'或類似的東西),或繼續前進,開始使用requests package做HTTP。

+2

或使用[自動解壓縮gzip編碼響應]的請求庫(http://www.python-requests.org/en/latest/community/faq/#encoded-data)。 –

+0

@PauloAlmeida是的,這是一個很好的建議。希望這個答案澄清OP的問題的根本原因。 – lmjohns3

+0

當然,我認爲你的答案是正確的,只是添加信息:) –