先分享一件倒霉事,让大家开心一下。
今天本来想去滑雪的,结果出门带错手机了,带成了备用机。不过无所谓,反正都能用。但是等我到清河站之后,准备再看一下滑雪场的位置时,才发现滑雪场只有周一到周五才开门,顿时懵圈了。
话说滑雪场那么远,周六日还不开门,难道还指望打工人在工作日的时候请假去吗?
言归正传,我发现随着时间的流逝,自己写文章的精力越来越少。正所谓人在江湖身不由己,时代的发展不以个人的意志为转移,每天都可能会有无数的事情等着你去处理,好不容易有时间了,第一想法也是休息或者放松。
所以大家会发现我的更新频率大不如从前了,前段时间本来还计划将 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(); }); }