用 Python 读取照片的 Exif 信息(顺便说说本人的一些想法)

简介: 用 Python 读取照片的 Exif 信息(顺便说说本人的一些想法)

先分享一件倒霉事,让大家开心一下。

今天本来想去滑雪的,结果出门带错手机了,带成了备用机。不过无所谓,反正都能用。但是等我到清河站之后,准备再看一下滑雪场的位置时,才发现滑雪场只有周一到周五才开门,顿时懵圈了。

话说滑雪场那么远,周六日还不开门,难道还指望打工人在工作日的时候请假去吗?

言归正传,我发现随着时间的流逝,自己写文章的精力越来越少。正所谓人在江湖身不由己,时代的发展不以个人的意志为转移,每天都可能会有无数的事情等着你去处理,好不容易有时间了,第一想法也是休息或者放松。

所以大家会发现我的更新频率大不如从前了,前段时间本来还计划将 FastAPI、Uvicorn 这些框架的源码带着大家一起剖析一下,结果该计划也胎死腹中。

当然说这些不是说以后就不更新了,一些有深度的文章还是会发的,只是为了不让更新频率太低,我会偶尔水几篇文章。

今天要水的文章是,用 Python 读取照片的 Exif 信息。现如今的智能手机在拍摄照片时,都含有 Exif(可交换图像文件格式,Exchangeable image file format)信息,通过该信息可以获取拍照时的位置、时间,以及手机品牌等信息。那么下面就看看如何使用 Python 去获取这些信息吧。

Python 想要读取 Exif 信息需要安装一个第三方库,直接 pip install exifread 即可。

import exifread
with open("1.jpg", 'rb') as f:
    # 直接可以拿到里面的信息,内容非常多
    # 但如果无法读取,那么返回值 exif 就是 None
    exif = exifread.process_file(f)
# 这里我们选一些常用的,里面的 value 需要转成字符串
# 不转成字符串的话看起来会比较费劲
print("图片宽度:", str(exif["Image ImageWidth"]))
print("图片高度:", str(exif["Image ImageLength"]))
print("手机品牌:", str(exif["Image Make"]))
print("手机型号:", str(exif["Image Model"]))
print("拍摄时间:", str(exif["Image DateTime"]))
print("经度:", str(exif["GPS GPSLongitude"]))
print("东经还是西经:", str(exif["GPS GPSLongitudeRef"]))
print("纬度:", str(exif["GPS GPSLatitude"]))
print("南纬还是北纬:", str(exif["GPS GPSLatitudeRef"]))
"""
图片宽度: 3968
图片高度: 2976
手机品牌: HUAWEI
手机型号: EML-AL00
拍摄时间: 2021:07:08 19:52:23
经度: [116, 28, 5973999/100000]
东经还是西经: E
纬度: [39, 59, 1255371/200000]
南纬还是北纬: N
"""

还是比较简单的,但是里面的经度和纬度比较怪,我们还需要再对其转化一下。

lng = str(exif["GPS GPSLongitude"])  # 经度
lat = str(exif["GPS GPSLatitude"])  # 纬度
print(lng)  # [116, 28, 5973999/100000]
print(lat)  # [39, 59, 1255371/200000]
# 转成列表
lng = lng[1: -1].replace("/", ",").split(",")
lat = lat[1: -1].replace("/", ",").split(",")
print(lat)  # ['39', ' 59', ' 1255371', '200000']
print(lng)  # ['116', ' 28', ' 5973999', '100000']
# 然后得到具体的经纬度
lng = float(lng[0]) + float(lng[1]) / 60 + float(lng[2]) / float(lng[3]) / 3600
lat = float(lat[0]) + float(lat[1]) / 60 + float(lat[2]) / float(lat[3]) / 3600
print(lng)  # 116.48326110833334
print(lat)  # 39.98507690416667

这里得到的经纬度永远是正数,如果是西经,那么得到的经度要乘上 -1;同理如果是南纬,那么纬度要乘上 -1。

另外需要注意,并非所有的照片都能够进行解析,必须是携带 Exif 信息的原始图片。如果中间进行了压缩、或者 P 图,那么就无法识别了。

当然像一些社交平台也会专门针对 Exif 进行处理,比如微信,你发在朋友圈的图片会自动压缩,所以是不会暴露位置信息的。

var first_sceen__time = (+new Date()); if ("" == 1 && document.getElementById('js_content')) { document.getElementById('js_content').addEventListener("selectstart",function(e){ e.preventDefault(); }); }

相关文章
|
2月前
|
Python
Python编程获取当前日期的所属周日期信息
Python编程获取当前日期的所属周日期信息
49 1
|
1天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
5天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
4天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
1天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
1天前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。
|
1天前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!
|
7天前
|
安全 程序员 Python
Python学习的自我理解和想法(1)
本篇博客记录了作者跟随B站“黑马程序员”课程学习Python的第一天心得,涵盖了`print()`、`input()`、`if...else`语句、三目运算符以及`for`和`while`循环的基础知识。通过实际编写代码,作者逐步理解并掌握了这些基本概念,为后续深入学习打下了良好基础。文中还特别强调了循环语句的重要性及其应用技巧。
|
1月前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
2月前
|
机器学习/深度学习 编解码 Python
python将照片集变成视频
`shigen`是一位坚持更新文章的博客作者,记录成长历程,分享认知见解,留住生活感动。他利用Python库`Pillow`和`MoviePy`开发了一个工具,能够批量处理照片并生成高质量视频。该工具支持多种分辨率、自定义播放时间和照片方向,并能自动调整照片比例以实现居中对齐。通过简单的代码实现了照片视频化的需求,适合强迫症患者使用。**与shigen一起,每天不一样!**个人IP:shigen。
51 9
python将照片集变成视频