现在的单反相机基本都不带gps,如果要给照片添加gps信息,需要一直开着官方的app,非常耗电,出去拍照,可能忘记打开app,或者手机电量不够都可能导致照片没有位置信息。
个人整理照片的时候,喜欢在手机的相册里通过位置找照片:
所以我就想把单反没有gps信息的照片手工补上gps信息。
在网上找了很多方法,大部分都很老,或者补上的gps 信息会位置偏移,就自己研究了一下:
--------------------------------------------------------------------------------------------------------------
思路这样:把没有位置信息的照片单独放一个文件夹(拷贝的副本,保持备份的习惯),
然后到地图拾取经纬度,然后填到照片的源数据。
1.准备一张照片
(建议先备份一下),我随便找了张壁纸
右键可以看到没有任何的位置信息
2.拾取坐标
到这个地址去直接拾取国际WGS84坐标
GPS工具箱管理https://web.gpstool.com/index
点击一个点,把这个点的经纬度记下来,
30.648850,104.045879
3.用python程序添加gps信息
然后用以下python代码
或者直接使用我打包好的exe程序。
阿里云盘分享https://www.aliyundrive.com/s/VeVn7bpQxtg提取码 1w0n
# ecoding:utf-8
import os
from PIL import Image
import piexif
import win32con
import win32uidef main():image_path = browse(True)[1]gps_str = input('请输入经纬度:')arr = gps_str.split(',')lng = float(arr[1])lat = float(arr[0])print(lng)print(lat)# 将经纬度与相对航高转为exif可用的经纬度与行高# exif需要的航高输入为(20000,2)格式,表示高度为20000/100米# exif需要的经度与维度为((12, 1), (20,1), (41000, 1000))格式表示12度20分41秒lng_exif = format_latlng(lng)lat_exif = format_latlng(lat)_dict = {"lng": lng_exif, "lat": lat_exif, "lng_ref": 'E', "lat_ref": 'N'}print("写入文件:", image_path)# 修改图片的exifread_modify_exif(image_path, _dict)def browse(mode: bool,default_name: str = "",title: str = "选择您的文件",file_type: str = "图片文件(*.png;*.jpg)|*.png;*.jpg|",path: str = "desktop"):"""弹出窗口返回保存或者选择的路径:param mode: False"为 "保存/另存为", "True"为 "打开":param default_name:默认输入文件名:param title:窗口提示:param file_type:可选的文件类型,所有文件(*.*)|*.*|图片文件(*.png;*.jpg)|*.png;*.jpg|:param path::return:[存储类型、文件路径、文件类型]"""api_flag = win32con.OFN_OVERWRITEPROMPT | win32con.OFN_FILEMUSTEXISTdlg = win32ui.CreateFileDialog(mode, None, default_name, api_flag, file_type)dlg.SetOFNTitle(title)dlg.SetOFNInitialDir(os.path.abspath(path))dlg.DoModal()filename = dlg.GetPathName()fileExt = dlg.GetFileExt()if os.path.exists(filename):if_pass = Trueelif not mode:if os.path.split(filename)[0] == '':if_pass = Falseelse:if_pass = Trueelse:if_pass = Falsereturn [if_pass, filename, fileExt]def format_latlng(latlng):"""经纬度十进制转为分秒"""degree = int(latlng)res_degree = latlng - degreeminute = int(res_degree * 60)res_minute = res_degree * 60 - minuteseconds = round(res_minute * 60.0, 3)return ((degree, 1), (minute, 1), (int(seconds * 1000), 1000))def read_modify_exif(image_path, _dict):""" 读取并且修改exif文件"""img = Image.open(image_path) # 读图exif_dict = piexif.load(img.info['exif']) # 提取exif信息exif_dict['GPS'][piexif.GPSIFD.GPSLongitude] = _dict['lng'] # 修改经度exif_dict['GPS'][piexif.GPSIFD.GPSLatitude] = _dict['lat'] # 修改纬度exif_dict['GPS'][piexif.GPSIFD.GPSLongitudeRef] = _dict['lng_ref'] # odm需要读取,一般为’W'exif_dict['GPS'][piexif.GPSIFD.GPSLatitudeRef] = _dict['lat_ref'] # 一般为‘N'exif_bytes = piexif.dump(exif_dict)print('lng:{} lat:{}'.format(exif_dict['GPS'][piexif.GPSIFD.GPSLongitude],exif_dict['GPS'][piexif.GPSIFD.GPSLatitude]))piexif.insert(exif_bytes, image_path)if __name__ == "__main__":main()
把python代码保存到本地py文件
双机执行会提示选择一个图片文件,我选择之前准备的图片文件。
然后会提示输入经纬度,则把上面准备的坐标输入回车即可。
然后图片就有经纬度信息了
可以用这个网站来看看位置信息
在线查看图片Exif信息_定位信息_GPS信息 - StrErr.com查看图片Exif信息https://www.strerr.com/cn/exif.html
然后就成功啦
这种方法有弊端,位置信息全靠记忆,比较麻烦,后期文章更新通过轨迹信息批量给照片添加位置信息的方法。