Python 读取图片 EXIF 信息解析拍摄地理位置与时间
背景介绍
在数字摄影中,大多数相机和手机在保存照片时会自动嵌入 EXIF(Exchangeable Image File Format)数据。这些数据通常包含拍摄时间、相机型号、光圈快门参数,以及最重要的——GPS 经纬度信息。
了解如何提取这些信息对于隐私保护、取证分析或地理标记管理具有重要意义。本文将演示如何使用 Python 脚本读取图片中的 GPS 元数据,并将其转换为具体的物理地址。
环境准备
首先,需要安装必要的 Python 库:
exifread:用于解析图片的 EXIF 标签。requests:用于调用地图 API。json:处理返回的 JSON 数据。re:正则表达式匹配。
安装命令如下:
pip install exifread requests
核心原理
1. 读取 EXIF 信息
EXIF 数据存储在图片的二进制文件中。使用 exifread 库可以方便地遍历这些标签。其中,GPS 相关的标签通常以 GPS: 开头,例如 GPS:GPSLatitudeRef(纬度方向)、GPS:GPSLatitude(纬度值)等。
注意:GPS 坐标通常以度分秒(DMS)格式存储,如 [24, 24, 35] 表示 24 度 24 分 35 秒。为了进行地理编码,通常需要将其转换为十进制度数(Decimal Degrees)。
2. 经纬度转换
将 DMS 转换为十进制的公式为:
$$ \text{Decimal} = \text{Degrees} + \frac{\text{Minutes}}{60} + \frac{\text{Seconds}}{3600} $$
3. 地理编码(Geocoding)
获取经纬度后,可以通过第三方地图服务(如百度地图、高德地图)的 API 接口,将坐标反转为具体的街道地址。
代码实现
步骤一:解析图片 GPS 信息
以下函数负责读取图片文件,提取 GPS 坐标及拍摄日期。
import exifread
import re
import json
# 辅助函数:将度分秒转换为十进制
def dms_to_decimal(degrees, minutes, seconds):
return float(degrees) + (float(minutes) / 60) + (float(seconds.split('/')[0]) / float(seconds.split('/')[-1]) / 60)
():
GPS = {}
date =
:
(pic_path, ) f:
tags = exifread.process_file(f)
tag, value tags.items():
re.(, tag):
GPS[] = (value)
re.(, tag):
GPS[] = (value)
re.(, tag):
GPS[] = (value)
re.(, tag):
:
match_result = re.(, (value))
match_result:
groups = match_result.groups()
GPS[] = dms_to_decimal(groups[], groups[], groups[] + + groups[])
:
deg, , sec = [x.replace(, ) x (value)[:-].split()]
GPS[] = dms_to_decimal(deg, , sec)
Exception:
re.(, tag):
:
match_result = re.(, (value))
match_result:
groups = match_result.groups()
GPS[] = dms_to_decimal(groups[], groups[], groups[] + + groups[])
:
deg, , sec = [x.replace(, ) x (value)[:-].split()]
GPS[] = dms_to_decimal(deg, , sec)
Exception:
re.(, tag):
date = (value)
FileNotFoundError:
()
{: GPS, : date}


