我知道您可以通过以下方式使用PIL获得图像大小
来自PIL导入图像的
im=Image.open(图像\文件名)
宽度、高度=im尺寸
但是,我希望获得图像宽度和高度,而不必将图像加载到内存中。可能吗?我只做图像大小的统计,不关心图像内容。我只是想让我的处理速度更快
如果你不关心图像内容,PIL可能是一种过度使用
我建议解析python magic模块的输出:
>&燃气轮机&燃气轮机;t=magic.from_文件('teste.png'))
&燃气轮机&燃气轮机&燃气轮机;T
'PNG图像数据,782 x 602,8位/彩色RGBA,非隔行'
&燃气轮机&燃气轮机&燃气轮机;重新搜索('(\d+)x(\d+),t).groups()
('782', '602')
这是一个围绕libmagic的包装器,它读取尽可能少的字节以识别文件类型签名
脚本的相关版本:
https://raw.githubusercontent.com/scardine/image_size/master/get_image_size.py
[更新]
不幸的是,当应用于JPEG时,上面给出了“JPEG图像数据,EXIF标准2.21”。没有图像大小!–亚历克斯·弗林特
似乎JPEG是抗魔法的。:-)
我明白原因了:为了获得JPEG文件的图像尺寸,您可能需要读取比libmagic喜欢读取的字节更多的字节
卷起袖子,附带了这个非常未经测试的代码片段(从GitHub获得),它不需要第三方模块
#-------------------------------------------------------------------------------
#名称:获取图像大小
#用途:仅使用以下命令提取给定文件路径的图像尺寸
#核心模块
#
#作者:Paulo Scardine(基于Emmanuel VAÏSSE的代码)
#
#创建日期:26/09/2013
#版权所有:(c)Paulo Scardine 2013
#执照:麻省理工学院
#-------------------------------------------------------------------------------
#!/usr/bin/env python
导入操作系统
导入结构
类UnknownImageFormat(异常):
通过
def get_图像大小(文件路径):
"""
给定img文件内容的返回值(宽度、高度)-无外部
core中除os和struct模块以外的依赖项
"""
size=os.path.getsize(文件路径)
以打开(文件路径)作为输入:
高度=-1
宽度=-1
数据=输入。读取(25)
如果('GIF87a'、'GIF89a')中的(尺寸>;=10)和数据[:6]:
#吉布斯
w、 h=结构解包(<;HH),数据[6:10])
宽度=整数(w)
高度=整数(h)
elif((size>;=24)和data.startswith('\211PNG\r\n\032\n'))
和(数据[12:16]=“IHDR”):
#PNGs
w、 h=结构解包(“>;LL”,数据[16:24])
宽度=整数(w)
高度=整数(h)
elif(size>;=16)和data.startswith('\211PNG\r\n\032\n'):
#老PNG?
w、 h=结构解包(“>;LL”,数据[8:16])
宽度=整数(w)
高度=整数(h)
elif(size>;=2)和data.startswith('\377\330'):
#JPEG
msg=“尝试解码为JPEG时引发。”
输入搜索(0)
输入。读取(2)
b=输入。读取(1)
尝试:
当(b)和ord(b)!=0xDA时:
while(ord(b)!=0xFF):b=input.read(1)
while(ord(b)==0xFF):b=input.read(1)
如果(ord(b)>;=0xC0和ord(b)<;=0xC3):
输入。读取(3)
h、 w=结构解包(“>;HH”,输入读取(4))
打破
其他:
input.read(int(struct.unpack(>;H),input.read(2))[0])-2)
b=输入。读取(1)
宽度=整数(w)
高度=整数(h)
除了struct.error:
raise UnknownImageFormat(“结构错误”+msg)
除值错误外:
raise UnknownImageFormat(“ValueError”+msg)
例外情况除外,如e:
raise UnknownImageFormat(e.__类_;.__名称_;+msg)
其他:
提出未知图像格式(
抱歉,不知道如何从该文件获取信息
)
返回宽度、高度
[2019年更新]
查看一个Rust实现:https://github.com/scardine/imsz