在Python中获取图片大小而不下载
我怎么能在不下载图片的情况下获取它的尺寸呢?这可能吗?我有一堆图片的链接,想给它们设置宽度和大小。
我知道有一种方法可以在本地做到这一点(如何使用Python检查目录中所有图片的尺寸?),但我不想下载所有的图片。
编辑:
根据编辑的建议,我修改了代码。最后我写出了这段代码。我不确定它是下载了整个文件还是只是部分内容(正是我想要的)。
11 个回答
16
这只是对之前一个答案的Python 3+版本改编,具体内容可以在这里找到。
from urllib import request as ulreq
from PIL import ImageFile
def getsizes(uri):
# get file size *and* image size (None if not known)
file = ulreq.urlopen(uri)
size = file.headers.get("content-length")
if size:
size = int(size)
p = ImageFile.Parser()
while True:
data = file.read(1024)
if not data:
break
p.feed(data)
if p.image:
return size, p.image.size
break
file.close()
return(size, None)
16
这段内容是基于ed的回答,加上我在网上找到的其他信息。我遇到了和grotos一样的问题,就是使用.read(24)的时候。你可以从这里下载getimageinfo.py文件,从这里下载ReSeekFile.py文件。
import urllib2
imgdata = urllib2.urlopen(href)
image_type,width,height = getimageinfo.getImageInfo(imgdata)
接下来,按照下面的方式修改getimageinfo...
import ReseekFile
def getImageInfo(datastream):
datastream = ReseekFile.ReseekFile(datastream)
data = str(datastream.read(30))
#Skipping to jpeg
# handle JPEGs
elif (size >= 2) and data.startswith('\377\330'):
content_type = 'image/jpeg'
datastream.seek(0)
datastream.read(2)
b = datastream.read(1)
try:
while (b and ord(b) != 0xDA):
while (ord(b) != 0xFF): b = datastream.read(1)
while (ord(b) == 0xFF): b = datastream.read(1)
if (ord(b) >= 0xC0 and ord(b) <= 0xC3):
datastream.read(3)
h, w = struct.unpack(">HH", datastream.read(4))
break
else:
datastream.read(int(struct.unpack(">H", datastream.read(2))[0])-2)
b = datastream.read(1)
width = int(w)
height = int(h)
except struct.error:
pass
except ValueError:
pass
24
我在这个网站上找到了一个很好的解决办法:
import urllib
import ImageFile
def getsizes(uri):
# get file size *and* image size (None if not known)
file = urllib.urlopen(uri)
size = file.headers.get("content-length")
if size: size = int(size)
p = ImageFile.Parser()
while 1:
data = file.read(1024)
if not data:
break
p.feed(data)
if p.image:
return size, p.image.size
break
file.close()
return size, None
print getsizes("http://www.pythonware.com/images/small-yoyo.gif")
# (10965, (179, 188))