如何在PIL中从互联网上打开图像?

mur*_*d99 24 python urllib2 python-imaging-library

我想在互联网上找到图像的尺寸.我试过用

from PIL import Image
import urllib2 as urllib
fd = urllib.urlopen("http://a/b/c")
im = Image.open(fd)
im.size
Run Code Online (Sandbox Code Playgroud)

正如在这个答案中所建议的那样,但是我收到了错误消息

addinfourl instance has no attribute 'seek'
Run Code Online (Sandbox Code Playgroud)

我检查过并且返回的对象urllib2.urlopen(url)似乎没有根据的搜索方法dir.

那么,我需要做些什么才能将图像从Internet加载到PIL中?

Sna*_*fee 35

您可以考虑使用io.BytesIO前向兼容.
Python 3中不存在StringIO和cStringIO模块.

from PIL import Image
import urllib2 as urllib
import io

fd = urllib.urlopen("http://a/b/c")
image_file = io.BytesIO(fd.read())
im = Image.open(image_file)
Run Code Online (Sandbox Code Playgroud)


jdi*_*jdi 8

使用相同的示例,只需使用StringIO将缓冲区包装到适当的文件类对象中:

from PIL import Image
import urllib2 as urllib
from StringIO import StringIO

fd = urllib.urlopen("http://a/b/c")
im = Image.open(StringIO(fd.read()))
im.size
Run Code Online (Sandbox Code Playgroud)


Mat*_*lla 8

使用Python requests:

from PIL import Image
from StringIO import StringIO
import requests

r = requests.get("http://a/b/c")
im = Image.open(StringIO(r.content))
im.size
Run Code Online (Sandbox Code Playgroud)


mfi*_*tzp 6

这个pull-request增加了对Pillow(友好的PIL fork)原生流处理的支持,应该可以从2.8.0版本获得.这允许使用urllib更简单地打开远程文件:

from PIL import Image
import urllib2
Image.open(urllib2.urlopen(url))
Run Code Online (Sandbox Code Playgroud)

......或使用请求:

from PIL import Image
import requests
Image.open(requests.get(url, stream=True).raw)
Run Code Online (Sandbox Code Playgroud)

正如mjpieters在PR请求中提到的那样,请求不会自动解码gzip响应,因此如果您正在下载因任何原因而被进一步压缩的图像,您必须decode_content=True在访问之前设置响应对象.raw.

response = requests.get(url, stream=True)
response.raw.decode_content = True
image = Image.open(response.raw)
Run Code Online (Sandbox Code Playgroud)