2013-09-01 85 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

当然,我认为你的答案是正确的,只是添加信息:) –