python读取图片exif属性中的GPS信息
智能手机或平板如果在拍照时开启定位服务,照片中就会记录拍照位置信息和拍摄时间。如果将原始照片直接发送发布到网上,无意中就泄漏了自己的位置信息,有恶意企图的人可能会通过照片分析出你的家庭住址和工作单位。
python
有很多工具库可以解析图片的exif
元数据信息,小编就喜欢使用exifread
这个库。
接下来就是完整代码,注:需要使用python3
图片exif属性中的经纬度是“度,分,秒”的形式,如:[25, 34, 5927/100]
,需要转换成类似“16.439683,39.941649999
”这样的形式。
除经纬度外,还要读取GPS
元数据中的东西半球和南北半球标识。
经纬度转换成地理位置需要调用地图服务接口,本程序代码采用百度的逆地理编码服务API
接口,调用接口需要申请服务密钥。
小编自己利用手机拍照测试,程序分析后得到的位置信息基本没有误差。
#!/bin/python
#coding:utf8
import os
import exifread
import re
import sys
import requests
import json
#代码功能:#
# 1.读取所有图片文件的exif信息
# 2.提取图片中的经纬度,将度、分、秒转换为小数形
# 3.利用百度地图API接口将经纬度转换成地址形式
#遍历文件夹及子文件夹中的所有图片,逐个文件读取exif信息
def get_pic_GPS(pic_dir):
items = os.listdir(pic_dir)
for item in items:
path = os.path.join(pic_dir, item)
if os.path.isdir(path):
get_pic_GPS(path)
else:
imageread(path)
#将经纬度转换为小数形式
def convert_to_decimal(*gps):
#度
if '/' in gps[0]:
deg = gps[0].split('/')
if deg[0] == '0' or deg[1] == '0':
gps_d = 0
else:
gps_d = float(deg[0]) / float(deg[1])
else:
gps_d = float(gps[0])
#分
if '/' in gps[1]:
minu = gps[1].split('/')
if minu[0] == '0' or minu[1] == '0':
gps_m = 0
else:
gps_m = (float(minu[0]) / float(minu[1])) / 60
else:
gps_m = float(gps[1]) / 60
#秒
if '/' in gps[2]:
sec = gps[2].split('/')
if sec[0] == '0' or sec[1] == '0':
gps_s = 0
else:
gps_s = (float(sec[0]) / float(sec[1])) / 3600
else:
gps_s = float(gps[2]) / 3600
decimal_gps = gps_d + gps_m + gps_s
#如果是南半球或是西半球
if gps[3]== 'W'or gps[3]=='S' or gps[3]== "83"or gps[3<