每张图片都包含EXIF信息,这是可交换图像文件的缩写,是为数码相机的照片专门设置的,可以记录数码照片的属性信息和拍摄数据. EXIF可以附加到JPEG,TIFF,RIFF等文件中,以添加与数码相机拍摄信息或图像处理软件的版本信息有关的内容和索引图. 总而言之,EXIF信息包含所拍摄照片的基本信息.
互联网上有许多EXIF信息查看器. 在这里,我上传了电影《我的故乡和我》的照片,我于10月1日去和朋友们一起观看. 没有标志建筑背景. 使用此工具进行尝试. 查看信息非常直观,例如拍照时间,手机型号,地理位置等,如下所示:
接下来,通过Python exifread库函数解析照片. 它可以解析图像的EXIF信息,然后依靠百度地图开放平台将GPS坐标信息转换为特定位置. 如果要获得理想的效果,则需要满足以下要求:
其他人通过选择原始图像来发送照片;
相机拍照时华为 去exif,默认设置为GPS定位;
图片尚未上传;
步骤1: 登录百度地图开放平台,进入控制台,在这里进行说明,百度地图开放平台的定位包括Web开发和Android开发
诸如iOS开发之类的不同服务最终将生成服务密钥(AK). 我们的Python调用基于服务密钥,因此创建的业务影响很小,因此无需查看开发文档即可轻松进行开发.
第2步: 创建一个应用程序,在这里我将应用程序类型选择为: 服务器(没有类型会影响下一步操作,关键是获取服务密钥).
操作现已完成,可以使用获取的服务密钥进行访问.
最后,扩展您的学习范围并查看开发文档,主要是针对不同终端设备的SDK文档. 有需要的小伙伴可以专注于学习.
仍然将照片用于测试.
分析代码如下:
import requests
import exifread
class GetPhotoInfo:
def __init__(self, photo):
self.photo = photo
# 百度地图ak 请替换为自己申请的ak
self.ak = 'nYPs4LQ9a4VhVxj55AD69K6zgsRy9o4z'
self.location = self.get_photo_info()
def get_photo_info(self, ):
with open(self.photo, 'rb') as f:
tags = exifread.process_file(f)
try:
# 打印照片其中一些信息
print('拍摄时间:', tags['EXIF DateTimeOriginal'])
print('照相机制造商:', tags['Image Make'])
print('照相机型号:', tags['Image Model'])
print('照片尺寸:', tags['EXIF ExifImageWidth'], tags['EXIF ExifImageLength'])
# 纬度
lat_ref = tags["GPS GPSLatitudeRef"].printable
lat = tags["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
lat = float(lat[0]) + float(lat[1]) / 60 + float(lat[2]) / float(lat[3]) / 3600
if lat_ref != "N":
lat = lat * (-1)
# 经度
lon_ref = tags["GPS GPSLongitudeRef"].printable
lon = tags["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
lon = float(lon[0]) + float(lon[1]) / 60 + float(lon[2]) / float(lon[3]) / 3600
if lon_ref != "E":
lon = lon * (-1)
except KeyError:
return "ERROR:请确保照片包含经纬度等EXIF信息。"
else:
print("经纬度:", lat, lon)
return lat, lon
def get_location(self):
url = 'http://api.map.baidu.com/reverse_geocoding/v3/?ak={}&output=json' \
'&coordtype=wgs84ll&location={},{}'.format(self.ak, *self.location)
response = requests.get(url).json()
status = response['status']
if status == 0:
address = response['result']['formatted_address']
print('详细地址:', address)
else:
print('baidu_map error')
if __name__ == '__main__':
Main = GetPhotoInfo('im1.jpg')
Main.get_location()
虽然地理位置和实际电影位置之间存在一些偏差,但基本信息还是非常准确的华为 去exif,并且与对EXIF信息查看器的分析一致. 分析结果如下:
作者: 华为云开发人员不提供特殊的脱发程序猿
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-284701-1.html