用 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(); }); }

相关文章
|
数据库 Python
Python学习的自我理解和想法(18)
这是我在学习Python第18天的总结,内容基于B站千锋教育课程,主要涉及面向对象编程的核心概念。包括:`self`关键字的作用、魔术方法的特点与使用(如构造函数`__init__`和析构函数`__del__`)、类属性与对象属性的区别及修改方式。通过学习,我初步理解了如何利用这些机制实现更灵活的程序设计,但深知目前对Python的理解仍较浅显,欢迎指正交流!
|
安全 数据安全/隐私保护 Python
Python学习的自我理解和想法(27)
本文记录了学习Python第27天的内容,主要介绍了使用Python操作PPTX和PDF的技巧。其中包括通过`python-pptx`库创建PPTX文件的详细步骤,如创建幻灯片对象、选择母版布局、编辑标题与副标题、添加文本框和图片,以及保存文件。此外,还讲解了如何利用`PyPDF2`库为PDF文件加密,涵盖安装库、定义函数、读取文件、设置密码及保存加密文件的过程。文章总结了Python在处理文档时的强大功能,并表达了对读者应用这些技能的期待。
|
数据采集 机器学习/深度学习 自然语言处理
Python学习的自我理解和想法(16)
这是我在B站千锋教育课程中学Python的第16天总结,主要学习了`datetime`和`time`模块的常用功能,包括创建日期、时间,获取当前时间及延迟操作等。同时简要介绍了多个方向的补充库,如网络爬虫、数据分析、机器学习等,并讲解了自定义模块的编写与调用方法。因开学时间有限,内容精简,希望对大家有所帮助!如有不足,欢迎指正。
Python学习的自我理解和想法(19)
这是一篇关于Python面向对象学习的总结,基于B站千锋教育课程内容编写。主要涵盖三大特性:封装、继承与多态。详细讲解了继承(包括构造函数继承、多继承)及类方法与静态方法的定义、调用及区别。尽管开学后时间有限,但作者仍对所学内容进行了系统梳理,并分享了自己的理解,欢迎指正交流。
|
API Python
VIN码查询API的实战指南:获取二手车信息以Python为例
随着机动车保有量上升,中国二手车市场迎来发展机遇。本文介绍如何通过VIN码查询API获取车辆详细信息,提升交易透明度与安全性。
657 1
|
数据采集 数据挖掘 Python
Python学习的自我理解和想法(22)
本文记录了作者学习Python第22天的内容——正则表达式,基于B站千锋教育课程。文章简要介绍了正则表达式的概念、特点及使用场景(如爬虫、数据清洗等),并通过示例解析了`re.search()`、`re.match()`、拆分、替换和匹配中文等基本语法。正则表达式是文本处理的重要工具,尽管入门较难,但功能强大。作者表示后续会深入讲解其应用,并强调学好正则对爬虫学习的帮助。因时间有限,内容为入门概述,不足之处敬请谅解。
|
设计模式 数据库 Python
Python学习的自我理解和想法(20)
这是我在B站千锋教育课程中学习Python第20天的总结,主要涉及面向对象编程的核心概念。内容包括:私有属性与私有方法的定义、语法及调用方式;多态的含义与实现,强调父类引用指向子类对象的特点;单例设计模式的定义、应用场景及实现步骤。通过学习,我掌握了如何在类中保护数据(私有化)、实现灵活的方法重写(多态)以及确保单一实例(单例模式)。由于开学时间有限,内容简明扼要,如有不足之处,欢迎指正!
|
存储 搜索推荐 算法
Python学习的自我理解和想法(28)
本文记录了学习Python第28天的内容——冒泡排序。通过B站千锋教育课程学习,非原创代码。文章详细介绍了冒泡排序的起源、概念、工作原理及多种Python实现方式(普通版、进阶版1和进阶版2)。同时分析了其时间复杂度(最坏、最好、平均情况)与空间复杂度,并探讨了实际应用场景(如小规模数据排序、教学示例)及局限性(如效率低下、不适用于高实时性场景)。最后总结了冒泡排序的意义及其对初学者的重要性。
Python学习的自我理解和想法(23)
本文记录了学习Python正则表达式的第23天心得,内容基于B站麦叔课程。文章分为三个部分:1) 正则表达式的七个境界,从固定字符串到内部约束逐步深入;2) 写正则表达式的套路,以座机号码为例解析模式设计;3) 正则表达式语法大全,涵盖字符类别、重复次数、组合模式、位置、分组、标记、特殊字符和替换等知识点。总结中表达了对知识的理解,并欢迎指正。
|
索引 Python
Python学习的自我理解和想法(24)
本文记录了学习Python操作Excel的第24天内容,基于B站千锋教育课程。主要介绍openpyxl插件的使用,包括安装、读取与写入Excel文件、插入图表等操作。具体内容涵盖加载工作簿、获取单元格数据、创建和保存工作表,以及通过图表展示数据。因开学时间有限,文章简要概述了各步骤代码实现,适合初学者参考学习。如有不足之处,欢迎指正!

推荐镜像

更多