单反相机照片用python 脚本添加gps位置信息

现在的单反相机基本都不带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/vxENXi63yDE提取码 35ob

# ecoding:utf-8
import os
from PIL import Image
import piexif
import win32con
import win32ui
import ctypes

"""
安装第三方包
pip install piexif
pip install pywin32
pip install Pillow
pip install pyinstaller
打包命令:pyinstaller -F -i .\gps.ico .\gps.py
"""

# DIP缩放设置
awareness = ctypes.c_int()
errorCode = ctypes.windll.shcore.GetProcessDpiAwareness(0, ctypes.byref(awareness))
errorCode = ctypes.windll.shcore.SetProcessDpiAwareness(2)
success = ctypes.windll.user32.SetProcessDPIAware()


def main():
    image_path = browse(True)[1]
    gps_str = input('请输入经纬度:')
    arr = gps_str.split(',')
    lng = float(arr[1])
    lat = float(arr[0])

    # 将经纬度与相对航高转为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)
    # 判断图片是否有exif
    read_check_exif(image_path)
    # 修改图片的exif
    read_modify_exif(image_path, _dict)


def browse(mode: bool,
           default_name: str = "",
           title: str = "选择您的文件",
           file_type: str = "图片文件(*.jpg)|*.jpg|",
           path: str = "desktop"):
    """弹出窗口返回保存或者选择的路径
    :param mode: False"为 "保存/另存为", "True"为 "打开"
    :param default_name:默认输入文件名
    :param title:窗口提示
    :param file_type:可选的文件类型,所有文件(*.*)|*.*|图片文件(*.jpg)|*.jpg|
    :param path:
    :return:[存储类型、文件路径、文件类型]
    """
    api_flag = win32con.OFN_OVERWRITEPROMPT | win32con.OFN_FILEMUSTEXIST
    dlg = 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 = True
    elif not mode:
        if os.path.split(filename)[0] == '':
            if_pass = False
        else:
            if_pass = True
    else:
        if_pass = False
    return [if_pass, filename, fileExt]


def format_latlng(latlng):
    """经纬度十进制转为分秒"""
    degree = int(latlng)
    res_degree = latlng - degree
    minute = int(res_degree * 60)
    res_minute = res_degree * 60 - minute
    seconds = round(res_minute * 60.0, 3)

    return ((degree, 1), (minute, 1), (int(seconds * 1000), 1000))


def read_check_exif(image_path):
    """
    判断图片是否有'exif'信息,没有就写入初始'exif'信息
    :param image_path:图片路径
    :return:无
    """
    img = Image.open(image_path)  # 读图
    try:
        exif_dict = piexif.load(img.info['exif'])  # 提取exif信息
    except KeyError:
        # 处理exif不存在的情况
        # 创建一个初始的EXIF字典
        exif_dict = {"0th": {}, "Exif": {}, "GPS": {}, "Interop": {}, "1st": {}, "thumbnail": None}
        # 将EXIF字典添加到图像的元数据中
        exif_bytes = piexif.dump(exif_dict)
        img.save(image_path, exif=exif_bytes)


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)
    piexif.insert(exif_bytes, image_path)


if __name__ == "__main__":
    main()

把python代码保存到本地py文件

运行前得先安装依赖的第三方包:

pip install piexif
pip install pywin32
pip install Pillow
pip install pyinstaller

 

python第三方包安装后,双击执行py文件会提示选择一个图片文件,我选择之前准备的图片文件。 

然后会提示输入经纬度,则把上面准备的坐标输入回车即可。 

然后图片就有经纬度信息了

可以用这个网站来看看位置信息

在线查看图片Exif信息_定位信息_GPS信息 - StrErr.com查看图片Exif信息https://www.strerr.com/cn/exif.html

 

然后就成功啦

 这种方法有弊端,位置信息全靠记忆,比较麻烦,后期文章更新通过轨迹信息批量给照片添加位置信息的方法。

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: Unity是一款非常强大的游戏开发引擎,它提供了丰富的工具和功能,方便开发者创建出高质量的游戏和应用程序。对于接入松下单反相机,Unity也提供了支持。 首先,我们需要在Unity中导入松下单反相机的SDK。松下提供了可以与Unity兼容的SDK,开发者可以直接从松下官网上下载并导入到Unity项目中。 导入SDK后,我们就可以通过脚本代码来控制松下单反相机的功能了。比如,我们可以通过调用相机的接口来进行拍照、录像、调整曝光、焦距等操作。Unity的脚本代码能够与相机的SDK进行交互,实现对相机的控制和操作。 同时,Unity还可以通过视频流的方式显示松下单反相机的实时画面。我们可以将相机的视频流数据传输到Unity中,并在游戏或应用程序中进行实时显示。这样,开发者可以更好地利用松下单反相机的图像质量和功能进行游戏或应用程序的开发。 总的来说,Unity提供了与松下单反相机的接入支持,在Unity中可以轻松地控制相机的功能,并显示相机的实时画面。这为开发者创造出更丰富、更真实的游戏和应用程序提供了方便。 ### 回答2: Unity是一种用于开发游戏和应用程序的跨平台引擎,可以用于多种平台如PC、移动设备以及虚拟现实设备。要将松下单反相机接入Unity,我们需要按照以下步骤进行操作: 1. 首先,我们需要获取松下单反相机的开发者文档。在该文档中,将包含与相机通信的相关信息,如相机的连接方式、数据传输协议等。 2. 接下来,我们需要创建一个Unity项目。在Unity编辑器中,我们可以选择创建一个新项目或打开现有项目。 3. 在Unity项目中,我们需要导入适当的插件或资产来实现与松下单反相机的通信。我们可以在Unity Asset Store中搜索相关插件,或者寻找第三方开发者提供的插件。 4. 一旦导入插件,我们需要根据插件的文档或示例代码编写脚本。这些脚本将实现与松下单反相机的通信和数据处理功能,例如获取相机图像、控制相机设置等。 5. 在Unity场景中,我们可以创建相机对象并将其与松下相机进行关联。通过调用编写的脚本中的相应函数,我们可以实现与相机的交互,例如启动相机、拍摄照片等。 6. 最后,我们可以在Unity中进行测试和调试,确保相机与Unity项目之间的通信正常。我们可以在编辑器中进行测试,也可以在目标设备上进行真机测试。 总结而言,要将松下单反相机接入Unity,我们需要获取开发者文档、导入合适的插件、编写相应的脚本以及进行测试。通过这些步骤,我们可以实现Unity与松下单反相机的集成,并利用Unity的众多功能为相机创建游戏或应用程序。 ### 回答3: 要将松下单反相机接入Unity引擎,需要进行以下步骤。 首先,确保你的松下单反相机支持通过USB连接到计算机,并在计算机上安装了适当的驱动程序。连接相机和计算机后,确保相机处于正常工作状态。 接下来,在Unity中创建一个新的项目或打开现有项目。在Unity编辑器中,点击"Assets"菜单,选择"Import Package",然后选择"Custom Package"。浏览并选择你从松下获得的提供相机连接功能的Unity插件包,点击导入。 安装完成后,你可以在Unity编辑器中的"Window"菜单下找到相机插件的相关选项。打开插件设置,并根据需要进行配置。这可能包括选择相机的连接方式(USB连接或无线连接)、设置图像采集的分辨率和帧率等。 完成上述设置后,你可以通过在Unity中创建相应的游戏对象来显示相机捕获到的图像。在Unity编辑器中,创建一个新的物体,将相机插件的脚本组件添加到该物体上。在脚本的相关属性中,输入相机的标识符或名称,以便Unity能够正确地识别并连接到你的松下单反相机。 最后,你可以在Unity场景中放置一个平面或其他适当的游戏对象来显示相机捕获到的图像。确保在播放模式下测试该功能,并进行必要的调试和优化。 通过以上步骤,你就可以成功地将松下单反相机接入Unity引擎,并在你的项目中使用该相机的图像数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值