我想在互联网上找到图像的尺寸。我尝试使用
from PIL import Image
import urllib2 as urllib
fd = urllib.urlopen("http://a/b/c")
im = Image.open(fd)
im.size
如this answer中所述,但我收到错误消息
addinfourl instance has no attribute 'seek'
我检查了urllib2.urlopen(url)
返回的对象似乎没有根据dir
的搜索方法。
那么,我需要做些什么才能将图像从Internet加载到PIL中?
答案 0 :(得分:32)
您可以考虑将io.BytesIO
用于forward compatibility
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)
答案 1 :(得分:7)
使用相同的示例,只需使用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
答案 2 :(得分:7)
使用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
答案 3 :(得分:6)
这个pull-request增加了对Pillow原生流处理(友好的PIL fork)的支持,应该可以从2.8.0版本获得。这样可以使用urllib:
更简单地打开远程文件from PIL import Image
import urllib2
Image.open(urllib2.urlopen(url))
...或使用requests:
from PIL import Image
import requests
Image.open(requests.get(url, stream=True).raw)
由于mentioned by mjpieters on the PR请求不会自动解码gzip
个响应,因此如果您要下载因任何原因而被进一步压缩的图片,则必须在响应对象上设置decode_content=True
在访问.raw
之前。
response = requests.get(url, stream=True)
response.raw.decode_content = True
image = Image.open(response.raw)
答案 4 :(得分:2)
urllib
documentation提到urlopen
返回的对象不支持seek
操作。
该模块提供了一个用于获取数据的高级接口 万维网。特别是,urlopen()函数是类似的 到内置函数open(),但接受Universal Resource 定位器(URL)而不是文件名。一些限制适用 - 它可以 只有用于阅读的开放URL,并且没有可用的搜索操作。
但是,PIL.open
函数明确要求它。
打开强>
Image.open(infile)=>图像
Image.open(infile,mode)=>图像
打开并识别给定的图像文件。这是一个懒惰的操作; 在您尝试之前,不会从文件中读取实际图像数据 处理数据(调用load方法强制加载)。如果模式 给出了论证,它必须是“r”。
您可以使用字符串(表示文件名)或文件 宾语。在后一种情况下,文件对象必须实现read,seek, 并告诉方法,并以二进制模式打开。
尝试使用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
答案 5 :(得分:0)
使用请求库并以字节形式获取输出
import requests
import io
response = requests.get("https://i.imgur.com/ExdKOOz.png")
image_bytes = io.BytesIO(response.content)
答案 6 :(得分:-2)
这个答案是在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')