使用Python提取JPEG图像文件dpi并计算物理尺寸

感谢浙江省浦江中学方春林老师提供的问题、测试图像和第一版本的代码!

下面的代码需要安装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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值