Python 如何在PIL中从internet打开图像?

Python 如何在PIL中从internet打开图像?,python,python-imaging-library,urllib2,Python,Python Imaging Library,Urllib2,我想在互联网上找到图像的维度。我试着用 from PIL import Image import urllib2 as urllib fd = urllib.urlopen("http://a/b/c") im = Image.open(fd) im.size 如中所建议,但我收到了错误消息 addinfourl instance has no attribute 'seek' 根据dir,我检查了,并且urlib2.urlopen(url)返回的对象似乎没有seek方法 那么,我必须做些什

我想在互联网上找到图像的维度。我试着用

from PIL import Image
import urllib2 as urllib
fd = urllib.urlopen("http://a/b/c")
im = Image.open(fd)
im.size
如中所建议,但我收到了错误消息

addinfourl instance has no attribute 'seek'
根据
dir
,我检查了,并且
urlib2.urlopen(url)
返回的对象似乎没有seek方法

那么,我必须做些什么才能将图像从Internet加载到PIL?

提到由
urlopen
返回的对象不支持
seek
操作

该模块提供了一个高级接口,用于跨网络获取数据 万维网。具体而言,urlopen()函数与此类似 指向内置函数open(),但接受通用资源 定位器(URL)而不是文件名。一些限制适用-它可以 仅打开URL进行读取,不提供搜索操作

但是,函数明确要求它

打开

Image.open(infle)=>Image

Image.open(内嵌,模式)=>Image

打开并标识给定的图像文件。这是一个懒惰的操作; 在尝试读取之前,不会从文件中读取实际图像数据 处理数据(调用load方法以强制加载)。如果模式 如果给定参数,则必须为“r”

您可以使用字符串(表示文件名)或文件 对象在后一种情况下,文件对象必须实现读取、查找、, 并告诉方法,并以二进制模式打开

尝试使用
cStringIO
模块将字符串转换为类似文件的对象

from PIL import Image
import urllib2 as urllib
import cStringIO

fd = urllib.urlopen("http://a/b/c")
image_file = cStringIO.StringIO(fd.read())
im = Image.open(image_file)
im.size

你可以考虑使用.BR> 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)

使用相同的示例,只需使用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

使用Python
请求

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
这增加了对Pillow(友好的PIL fork)原生流处理的支持,应该可以从版本2.8.0中获得。这使得打开远程文件更为简单:

…或使用:

As请求不会自动解码
gzip
响应,因此,如果您正在下载由于任何原因而进一步压缩的图像,则必须在访问
.raw
之前在响应对象上设置
decode\u content=True

response = requests.get(url, stream=True)
response.raw.decode_content = True
image = Image.open(response.raw)

这个答案是4年前的了,但它仍然在谷歌排名第一。在Python3中, 我们有简单的解决方案

from urllib.request import urlopen
img =Image.open(urlopen('http://dl.iplaypython.com/images/banner336x280.jpg'))
new_img =img.resize((300,500),Image.ANTIALIAS)
new_img.save('url.jpg','jpeg')

使用请求库和以字节形式获取输出

import requests
import io

response = requests.get("https://i.imgur.com/ExdKOOz.png")
image_bytes = io.BytesIO(response.content)

虽然这个答案与其他答案不同,但它解决实际问题的方式与jdi的答案没有任何不同。它仍然将流包装在
StringIO
中。这对于没有urllib2但有请求的Docker映像来说是一种享受。感谢您发布一个替代方案。我建议使用最大大小,以避免意外的内存耗尽。您能再解释一下吗?
from urllib.request import urlopen
img =Image.open(urlopen('http://dl.iplaypython.com/images/banner336x280.jpg'))
new_img =img.resize((300,500),Image.ANTIALIAS)
new_img.save('url.jpg','jpeg')
import requests
import io

response = requests.get("https://i.imgur.com/ExdKOOz.png")
image_bytes = io.BytesIO(response.content)