目录
exifread获取图片信息
获取图片信息可以使用exifread库,第三方库需要安装。
要注意的是必须是携带 Exif 信息的原始图片才能解析。如果中间进行了压缩、或者P图等操作,则无法识别。如微信等一些社交平台会专门针对 Exif 进行处理,所以是不会暴露位置信息。
Exif是指可交换图像文件格式的缩写,它是一种为数字照片存储和传输附加元数据的标准格式。Exif包含了拍摄设备、拍摄日期、曝光时间、焦距、经纬度等多种信息。
使用exifread.process_file(f)方法读取图片数据,其中的参数为通过文件读取方式读取到图片的二进制数据流。
def get_img_data(file_path):
with open(file_path, 'rb') as f: # 只能使用rb二进制读写,使用w写入后,图标将被修改成无法被识别的文件,会使得图标被破坏
img_data = exifread.process_file(f)
data_keys = list(img_data.keys())
if 'GPS GPSLatitude' in data_keys and 'GPS GPSLongitude' in data_keys: # 判断目标数据是否存在,这里需要的是经纬度数据
GPSLatitude, GPSLongitude = img_data['GPS GPSLatitude'], img_data['GPS GPSLongitude']
# GPSLatitude, GPSLatitudeRef = img_data['GPS GPSLatitude'], img_data['GPS GPSLatitudeRef'] # 纬度
# GPSLongitude, GPSLongitudeRef = img_data['GPS GPSLongitude'], img_data['GPS GPSLongitudeRef'] # 经度
# ImageWidth, ImageLength = img_data['Image ImageWidth'], img_data['Image ImageLength'] # 图片大小
# ImageMake, ImageModel = img_data['Image Make'], img_data['Image Model'] # 设备平台及型号
# DateTime = img_data['Image DateTime'] # 拍摄图片时间
# 获取经纬度数据并转换成可读数据,需要根据度分秒转换【这里得到的经纬度永远是正数,如果是西经,那么得到的经度要乘上 -1;同理如果是南纬,那么纬度要乘上 -1】
gps_lat, gps_long = GPSLatitude.values, GPSLongitude.values
lat = float(gps_lat[0]) + float(gps_lat[1] / 60) + float(str(gps_lat[2]).split('/')[0]) / float(
str(gps_lat[2]).split('/')[1]) / 3600
long = float(gps_long[0]) + float(gps_long[1] / 60) + float(str(gps_long[2]).split('/')[0]) / float(
str(gps_long[2]).split('/')[1]) / 3600
return long, lat
else:
print('图片不存在经纬度信息')
return None
通过打印 img_data = exifread.process_file(f) 可以获取图片很多信息,如下所示:
百度地图接口获取地址信息
百度api接口AK申请登录百度账号
import exifread, requests, urllib, hashlib
def get_addr(ak, sk, long, lat):
host = "https://api.map.baidu.com" # 服务地址
uri = "/reverse_geocoding/v3" # 接口地址
params = {
"ak": ak,
"output": "json",
"coordtype": "wgs84ll",
"extensions_poi": "0",
"location": f"{lat},{long}",
} # 设置您的请求参数
# 拼接请求字符串
paramsArr = []
for key in params:
paramsArr.append(key + "=" + params[key])
queryStr = uri + "?" + "&".join(paramsArr)
encodedStr = urllib.request.quote(queryStr, safe="/:=&?#+!$,;'@()*[]") # 对queryStr进行转码,safe内的保留字符不转换
rawStr = encodedStr + sk # 在最后直接追加上您的SK
sn = hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest() # 计算sn
queryStr = queryStr + "&sn=" + sn # 将sn参数添加到请求中
# 请注意,此处打印的url为非urlencode后的请求串
# 如果将该请求串直接粘贴到浏览器中发起请求,由于浏览器会自动进行urlencode,会导致返回sn校验失败
url = host + queryStr
response = requests.get(url)
if response:
# print(response.json())
print(response.json()['result']['formatted_address'])
if __name__ == '__main__':
ak = "your_ak" # 此处填写你在控制台-应用管理-创建应用后获取的AK
sk = "your_sk" # 此处填写你在控制台-应用管理-创建应用时,校验方式选择sn校验后生成的SK
file_path = r'C:\Users\Administrator\Desktop\testfile\IMG_20240609_191135.jpg'
img_data = get_img_data(file_path)
if not img_data:
...
else:
long, lat = img_data
if long and lat:
get_addr(ak, sk, long, lat)