下面的代码需要安装Python图像处理库pillow,由于不同公司对JPEG压缩算法和格式的实现不完全一样,有些类型的jpg文件暂时无法提取dpi信息,如果找到好的办法的话后期会再进行补充。
from os import listdir
from PIL import Image
from PIL.ExifTags import TAGS
def getPhysicalSize(fn):
#打开图像文件并获取以像素为单位的尺寸
im = Image.open(fn)
width, height = im.size
#尝试直接获取dpi信息
try:
dpi = im.info['dpi']
except:
#如果直接获取失败,再尝试获取exif信息
t = {}
info = im._getexif()
#获取失败,直接返回
if not info:
return 'Not known'
#从exif信息中提取水平分辨率和垂直分辨率
for k, v in info.items():
tt = TAGS.get(k)
if tt in ('XResolution', 'YResolution'):
t[tt] = v
dpi = [item[1] for item in sorted(t.items())]
#获取失败,返回
if not dpi:
return 'Not known'
#不同压缩格式的文件信息保存方式不一样
#适当转换一下
if isinstance(dpi[0], tuple):
w_dpi, h_dpi = dpi[0][0], dpi[1][0]
else:
w_dpi, h_dpi = dpi
#返回物理尺寸信息,像素数/dpi分辨率,再换算成毫米
return (round(width/w_dpi*25.4,2), round(height/h_dpi*25.4,2))
for fn in (fns for fns in listdir('.') if fns.lower().endswith(('.jpg', '.jpeg'))):
print(fn, ':', getPhysicalSize(fn))