首页 > 编程语言 >使用Python提取JPEG图像文件dpi并计算物理尺寸

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

时间:2023-06-09 20:02:11浏览次数:46  
标签:info Python tt JPEG 获取 im fn 图像文件 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))

标签:info,Python,tt,JPEG,获取,im,fn,图像文件,dpi
From: https://blog.51cto.com/u_9653244/6450983

相关文章

  • Python中的枚举类型及其用法
    >>>fromenumimportEnum#导入模块中的类>>>classColor(Enum):#创建自定义枚举类red=1blue=2green=3>>>Color.red#访问枚举类的成员<Color.red:1>>>>type(Color.green)#查看枚举类成员的类型<enum'Color'>>&g......
  • 几行Python代码打造自己的磁盘垃圾文件清理器
    本文假设某些特定类型的文件和大小为0的文件为垃圾文件,可以自由扩展代码的列表,也就是垃圾文件的类型。fromos.pathimportisdir,join,splitextfromosimportremove,listdir,chmod,statimportsys#指定要删除的文件类型filetypes=['.tmp','.log','.obj','.txt']d......
  • Python+tkinter动态创建与销毁组件小案例
    本文代码演示了如何在tkinter窗体上动态创建组件以及销毁组件的方法。importtkinterimporttkinter.messageboximporttkinter.simpledialogbtnList=[]#动态创建组件,并计算组件在窗体上的位置defplace(n):foriinrange(n):exec('btn'+str(i)+'=tkinter.B......
  • Python代码调试之异常回溯
    当发生异常时,Python会回溯异常,给出大量的提示,可能会给程序员的定位和纠错带来一定的困难,这时可以使用sys模块的exc_info()函数来回溯最近一次异常。sys.exc_info()的返回值tuple是一个三元组(type, value, traceback),其中:type——异常的类型value——异常的信息或者参数tr......
  • Python+pandas读取Excel文件并统计演员参演电影数量
    Excel样本数据请参考Python读取Excel文件并统计演员参演电影>>>importpandasaspd>>>df=pd.read_excel('电影导演演员.xlsx')>>>df电影名称导演演员0电影1导演1演员1,演员2,演员3,演员41电影2导演2演员3,演员2,演员4,演......
  • python爬虫--爬取各大城市的各个区域的租房信息
    一、选题背景衣食住行是生活的基本需求。衣和食好解决,不喜欢的衣服可以买新的,不好吃的食物可以换一家吃。可是在住宿上,买房和租房的置换成本都相对较高,因此房源选择尤为慎重。作为目前买不起房的自然人,我们一般是通过中介来实现租房的需求比如自如,贝壳找房和链家。链家占据了租赁......
  • 详解Python中的浅复制与深复制
    列表对象的copy()方法返回列表的浅复制。所谓浅复制,是指生产一个新的列表,并且把原列表中所有元素的引用都复制到新列表中。如果原列表中只包含整数、实数、复数等基本类型或元组、字符串这样的不可变类型,一般是没有问题的。但是,如果原列表中包含列表之类的可变数据类型,由于浅复制时......
  • Python实现图像空域随机水印加入与提取
    本文要点在于Python扩展库pillow中Image类的运用。图像空域随机水印的主要思路在于:在原始图像中随机选取一些位置替换为水印图片中的非背景像素,同时生成日志文件记录替换的位置和水印中像素位置的对应关系,然后可以根据加入水印的图片和日志文件来提取和验证水印。fromosimportre......
  • Python泛型函数与单分发器
    这里的泛型函数是指由一组为不同类型参数执行相似操作的函数组成的函数,具体调用哪一个函数的实现取决于分发算法和参数类型。Python单分发器是实现泛型函数的一种形式,由一个单一参数来决定选择和调用哪个函数。下面的代码演示了单分发器泛型函数的有关用法:fromfunctoolsimportsi......
  • 列表元素循环移位中Python切片的妙用
    之前有个文章中介绍了列表循环移位的3中方法其中第二种方法虽然更直接地翻译了题目的要求,但是显得还是有点啰嗦,如果充分利用Python中的切片技术,可以写成下面更简洁的形式:>>>defdemo(lst,k):x=lst[k-1::-1]y=lst[:k-1:-1]returnlist(reversed(x+y))#测试用......