为图片设置经纬度信息
一、java实现
小编看了很多技术博客,但是测试要么下载的jar包中的api和博客对不上,要么就是不对,总之没实现
Java 读取图片信息
java 写入 exif 信息
使用Java读取和修改图片的Exif信息
java获取图片的GPS信息
https://drewnoakes.com/code/exif/
https://github.com/drewnoakes/metadata-extractor/
java 修改图片exif信息
JAVA 使用metadata-extractor添加水印
java 修改照片exif信息
ava图片识别文字软件 java识别图片文字 原理
java 修改图片exif信息
如何用一张照片进行GPS定位
https://www.jb51.net/program/319520ppk.htm
https://blog.csdn.net/qq_40985985/article/details/118605888
https://blog.51cto.com/u_16213361/10406427
https://blog.csdn.net/m0_51363655/article/details/125554155
https://blog.csdn.net/weixin_42350212/article/details/118467097
二、python实现
引用给家里的老照片添加时间、地点信息,方便查找回忆
from PIL import Image, ImageTk
from piexif import load, dump, ImageIFD,GPSIFD
import tkinter as tk
from tkinter import filedialog, messagebox
import pyperclipdef open_file():print("打开文件 start")file_path = filedialog.askopenfilename(title='选择图片文件')# file_path = 'C:/Users/hahaha/Pictures/IMG_1089.JPG'print(file_path)img = Image.open(file_path)img = img.resize((400, 300))img = ImageTk.PhotoImage(img)lable_img_display.config(image=img)lable_img_display.image = imgif file_path:print("打开文件:", file_path)# 打开图片image = Image.open(file_path)img_name_old_label.config(text=file_path)# 读取图片的原始exif信息'try:exif_dic = load(image.info["exif"])image_time = exif_dic["0th"][ImageIFD.DateTime]print(image_time)img_time_old_label.config(text=image_time)if exif_dic["GPS"]:longtitude = exif_dic['GPS'][GPSIFD.GPSLongitude] # 经度print(format_data(longtitude))img_longtitude_old_label.config(text=format_data(longtitude))latitude = exif_dic["GPS"][GPSIFD.GPSLatitude]print(format_data(latitude))img_latitude_old_label.config(text=format_data(latitude)) # 纬度print(longtitude)print(latitude)print(format_data(format_data(longtitude)))else:print("无GPS信息")img_longtitude_old_label.config(text="none")img_latitude_old_label.config(text="none")passexcept:img_time_old_label.config(text="none")img_longtitude_old_label.config(text="none")img_latitude_old_label.config(text="none")def format_data(latlong):print(type(latlong))if type(latlong) == float or type(latlong) == str or type(latlong) == int:latlong = float(latlong)degree = int(latlong)res_degree = latlong - degreeminute = int(res_degree * 60)res_minute = res_degree * 60 - minuteseconds = round(res_minute * 60, 3)_data = ((degree, 1), (minute, 1), (int(seconds * 100), 100))return _dataelif type(latlong) == tuple:_date = latlong[0][0]+latlong[1][0]/60+latlong[2][0]/60/6000return _datedef save_file():file_path = filedialog.asksaveasfilename()if file_path:print("保存文件:", file_path)def modify_exif():print('修改图片的exif信息')# 打开图片image_path = img_name_old_label.cget("text")image = Image.open(image_path)# 读取图片的原始exif信息try:exif_data = load(image.info["exif"])except:exif_data = {}if '0th' not in exif_data: # 判断是否存在基础信息 并创建基础信息exif_data['0th'] = {}if len(exif_data['0th']) == 0:exif_data['0th'] = {271: b'QRJ', #制造商272: b'scanner',#型号# 274: 1, # 图像方向# 282: (72, 1), #ImageWidth 方向上每个 ResolutionUnit 的像素数# 283: (72, 1), #ImageLength方向上每个 ResolutionUnit 的像素数# 296: 2, #XResolution 和 YResolution 的测量单位。305: b'IMG_EDITv1', #用于创建映像的软件包的名称和版本号。306: b'2000:00:00 00:00:00', # 创建时间# 531: 1,# 指定子采样色度分量相对于亮度样本的位置。# 34665: 208,# 34853: 1786}exif_data['0th'][ImageIFD.DateTime] = img_time_new_text.get() # 创建基础exif空字典if 'GPS' not in exif_data: # 判断是否存在基础GPS信息 并创建GPS基础信息exif_data['GPS'] = {} # 创建gps空字典if len(exif_data['GPS']) == 0:exif_data['GPS'] = {1: b'N', # 南北纬2: ((40, 1), (6, 1), (2386, 100)), # 纬度3: b'E', #东西经4: ((116, 1), (32, 1), (5287, 100)), # 经度# 5: 0, #表示作为参考高度的高度# 6: (13973, 415), #根据 GPSAltitudeRef 中的参考值指示高度# 7: ((4, 1), (5, 1), (4760, 100)), #表示时间为 UTC(协调世界时)。# 12: b'K', #表示用于表示 GPS 接收器移动速度的单位。# 13: (0, 1), #表示GPS接收器移动的速度# 16: b'T', #表示在捕获图像时给出图像方向的参考。# 17: (10159, 338), #表示图像拍摄时的方向。# 23: b'T', #表示用于给目标点方位的参考。# 24: (10159, 338), #表示到目的地的方位。# 29: b'2000:00:00', #一个字符串,记录相对于 UTC(协调世界时)的日期和时间信息。# 31: (65, 1) #指示是否对 GPS 接收器应用差分校正。}# if GPSIFD.GPSLongitude not in exif_data['GPS']:
# exif_data['GPS'][GPSIFD.GPSLongitude] = [] # 创建gps空列表if img_longtitude_new_text.get() == '':messagebox.showinfo("提示", "请输入经度")returnexif_data['GPS'][GPSIFD.GPSLongitude] = format_data(img_longtitude_new_text.get()) # 更新经度
# if GPSIFD.GPSLatitude not in exif_data['GPS']:
# exif_data['GPS'][GPSIFD.GPSLatitude] = []if img_latitude_new_text.get() == '':messagebox.showinfo("提示", "请输入纬度")returnexif_data['GPS'][GPSIFD.GPSLatitude] = format_data(img_latitude_new_text.get()) # 更新纬度########################EXIF信息################################if 'Exif' not in exif_data: # 判断是否存在Exif信息 并创建Exif信息exif_data['Exif'] = {}if len(exif_data['Exif']) == 0:exif_data['Exif'] = {# 33434: (1, 400),# 33437: (22, 10),# 34850: 3,# 34855: 100,# 34864: 2,# 34866: 100,# 36864: b'0230',36867: b'2022:10:30 17:01:01',# 36868: b'2022:10:30 17:02:02',# 37121: b'\x01\x02\x03\x00',# 37377: (565248, 65536),# 37378: (155648, 65536),# 37380: (0, 1),# 37383: 5,# 37385: 16,# 37386: (50, 1),# 42037: b'0000205042\x00'}exif_data['Exif'][36867] = img_time_new_text.get() # 创建Exif时间信息#############Interop信息######################################## if 'Interop' not in exif_data:# exif_data['Interop'] = {}# if len(exif_data['Interop']) == 0:# exif_data['Interop'] = {1: b'R98'}##################1st############### if '1st' not in exif_data:# exif_data['1st'] = {}# if len(exif_data['1st']) == 0:# exif_data['1st'] = {# 259: 6,# 282: (72, 1),# 283: (72, 1),# 296: 2,# 513: 8916,# 514: 14640# }# 修改原始exif信息# exif_data.update(new_exif_dict)exif_bytes = dump(exif_data)# 设置新的exif信息image.save(image_path, exif=exif_bytes)def paste_location():# TODO: 从剪贴板中粘贴经纬度gps_info=pyperclip.paste()print(gps_info)if ',' in gps_info:gps_info = gps_info.split(',')img_longtitude_new_text.insert(tk.END, gps_info[0])img_latitude_new_text.insert(tk.END, gps_info[1])passif __name__ == '__main__':# TODO: 实现GUI或者命令行接口,让用户选择操作root = tk.Tk()root.title("文件对话框")root.geometry("600x500")img_info_frame = tk.Frame(root)img_info_frame.pack(pady=20)img_name_label = tk.Label(img_info_frame, text="图片名称")img_name_label.grid(row=0, column=0)img_name_old_label = tk.Label(img_info_frame, text="原图片")img_name_old_label.grid(row=0, column=1)img_time_label = tk.Label(img_info_frame, text="图片时间")img_time_label.grid(row=1, column=0)img_time_old_label = tk.Label(img_info_frame, text="原图片时间")img_time_old_label.grid(row=1, column=1)img_time_new_text = tk.Entry(img_info_frame, width=20)img_time_new_text.grid(row=1, column=2)img_time_new_text.insert(tk.END, "2018:02:02 21:44:35")# img_time_new_text.config(state=tk.DISABLED)img_longitude_label = tk.Label(img_info_frame, text="经度")img_longitude_label.grid(row=2, column=0)img_longtitude_old_label = tk.Label(img_info_frame, text="原经度")img_longtitude_old_label.grid(row=2, column=1)img_longtitude_new_text = tk.Entry(img_info_frame, width=20)img_longtitude_new_text.grid(row=2, column=2)img_latitude_label = tk.Label(img_info_frame, text="纬度")img_latitude_label.grid(row=3, column=0)img_latitude_old_label = tk.Label(img_info_frame, text="原纬度")img_latitude_old_label.grid(row=3, column=1)img_latitude_new_text = tk.Entry(img_info_frame, width=20)img_latitude_new_text.grid(row=3, column=2)button_frame = tk.Frame(root,width=600,height=50)button_frame.pack()open_button = tk.Button(button_frame, text="打开单独文件", command=open_file)open_button.grid(row=4, column=2)save_button = tk.Button(button_frame, text="保存文件", command=save_file)save_button.grid(row=4, column=3)modify_button = tk.Button(button_frame, text="修改exif", command=modify_exif)modify_button.grid(row=4, column=4)paste_button = tk.Button(button_frame, text="粘贴经纬度", command=paste_location)paste_button.grid(row=4, column=5)website_text = tk.Text(root, width=54, height=1)website_text.pack()website_text.insert(tk.END, "https://api.map.baidu.com/lbsapi/getpoint/index.html")lable_img_display = tk.Label(root,width=400,height=300)lable_img_display.pack()#webview2 创建坐标浏览页面# web_view = tk.root.mainloop()pass
引用单反相机照片用python 脚本添加gps位置信息
三方依赖库
pip install piexif
pip install pywin32
pip install Pillow
pip install pyinstaller
# 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)# 判断图片是否有exifread_check_exif(image_path)# 修改图片的exifread_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_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_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()
可以用这个网站来看看位置信息
本工具可查看图片Exif信息、图片定位信息、图片GPS信息、图片经纬度信息
https://web.gpstool.com/index
拾取坐标
https://api.map.baidu.com/lbsapi/getpoint/index.html
相关文章:

为图片设置经纬度信息
一、java实现 小编看了很多技术博客,但是测试要么下载的jar包中的api和博客对不上,要么就是不对,总之没实现 Java 读取图片信息 java 写入 exif 信息 使用Java读取和修改图片的Exif信息 java获取图片的GPS信息 https://drewnoakes.com/code/e…...

密码和密钥的联系与区别
密码和密钥是两个非常重要的概念,但容易混淆这两者,以下内容介绍了它们的联系和区别: 一、定义 密码(Password),在日常语境中,通常指的是个人为了验证自己的身份而设置的一段秘密的字符序列&am…...

C++编程法则365天一天一条(323)main函数执行之前和之后的动作
在C和C程序中,main 函数之前和之后执行的函数是由编译器、链接器和运行时环境共同决定的。以下是一些通常会在这些阶段执行的关键函数: 在 main 函数之前执行的函数 启动代码(Start-up Code): 这是由编译器提供的一段代码&#…...

阿里云短信服务使用(Java)
文章目录 一、流程1.打开短信服务2.提交材料申请资质3.资质通过后,申请短信签名并设置短信模板4.右上角设置AccessKey5.充值 二、参考官方文档调用API1.引入maven依赖2.调用API补充 一、流程 1.打开短信服务 登陆注册阿里云 搜索“短信服务”,点击“免…...

C++17之std::void_t
目录 1.std::void_t 的原理 2.std::void_t 的应用 2.1.判断成员存在性 2.1.1.判断嵌套类型定义 2.1.2 判断成员是否存在 2.2 判断表达式是否合法 2.2.1 判断是否支持前置运算符 2.2.3 判断两个类型是否可做加法运算 3.std::void_t 与 std::enable_if 1.std::void_t 的…...

零基础入门篇①⑥ Python可变序列类型--字典
Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏限时一个月(5.8~6.8)重…...

C语言面试题1-10
C语言中的内存管理及相关问题探讨 在C语言编程中,内存管理是一个至关重要的概念,掌握内存的分布及其操作不仅能够提高代码效率,还能避免常见的内存泄漏等问题。本文将详细介绍C语言中内存的分布、堆区和栈区的区别、标识符的命名规则、定义和…...

Qt Designer工具如何修改MainWindow窗口的标题
Qt Designer工具如何修改MainWindow窗口的标题 在MainWindow的属性编辑器中选择“windowTitle”后面一栏修改成期望的窗口标题名称即可。 按住“ctrlR”即可查看可视化界面的窗口标题...

车辆前向碰撞预警系统性能要求和测试规程
前言 本文整理《GB/T 33577-2017 智能运输系统-车辆前向碰撞预警系统性能要求和测试规程》国标文件关键信息,FCW系统性能和测试右给深层次的认识。 术语和定义 车辆前向碰撞预警系统 forward vehicle collision warning system自车 subject vehicle(SV)目标车辆 target ve…...

C#实现winform中渲染图的展示
在WinForms中实现图形的渲染展示,可以使用GDI绘图技术。下面是一个简单的示例,演示如何在WinForms中展示一个圆形图形,并根据用户输入的半径动态改变圆的大小: 请在Visual Studio中创建一个WinForms应用程序,并将以下…...

JTS库的讲解及使用
JTS(Java Topology Suite)是一套用于创建、操作和分析二维几何对象的Java库。JTS提供了丰富的几何操作和分析功能,是GIS(地理信息系统)应用中的重要工具。以下是JTS库的一些主要功能及其详细使用示例: 1. …...

【C++杂货铺】unordered系列容器
目录 🌈 前言🌈 📁 unordered系列关联式容器 📁 底层结构 📂 哈希概念 📂 哈希冲突 📂 哈希函数 📂 哈希冲突解决 📁 模拟实现 📁 总结 🌈 前…...

模板-初阶
引言: 在C,我们已经学过了函数重载,这使得同名函数具有多个功能。但是还有一种更省力的方法:采用模板。 本文主要介绍以下内容 1. 泛型编程 2. 函数模板 3. 类模板 1.泛型编程 在将这一部分之前,通过一个故事引…...

重载运算符C++---学习笔记
一、笔记 1. 重载运算符基础知识 重载运算符进行的运算和普通数的加减运算不同之处在于重载运算符的操作数为一个一个自定义的对象,所以相应的要对普通的运算符如-*%/的调用方法进行重写,重载的本质还是函数调用 2. 重载运算符的语法 重载运算符的语…...

SpringMVC枚举类型字段处理
在日常的项目开发中经常会遇到一些取值范围固定的字段,例如性别、证件类型、会员等级等,此时我们可以利用枚举来最大程度减少字段的乱定义,统一管理枚举的值。 SpringMVC中对于枚举也有默认的处理策略: 对于RequestParam…...

集成算法:Bagging模型、AdaBoost模型和Stacking模型
概述 目的:让机器学习效果更好,单个不行,集成多个 集成算法 Bagging:训练多个分类器取平均 f ( x ) 1 / M ∑ m 1 M f m ( x ) f(x)1/M\sum^M_{m1}{f_m(x)} f(x)1/M∑m1Mfm(x) Boosting:从弱学习器开始加强&am…...

DW怎么Python:探索Dreamweaver与Python的交织世界
DW怎么Python:探索Dreamweaver与Python的交织世界 在数字世界的广袤天地中,Dreamweaver(简称DW)与Python这两大工具各自闪耀着独特的光芒。DW以其强大的网页设计和开发能力著称,而Python则以其简洁、易读和强大的编程…...

算法(十三)回溯算法---N皇后问题
文章目录 算法概念经典例子 - N皇后问题什么是N皇后问题?实现思路 算法概念 回溯算法是类似枚举的深度优先搜索尝试过程,主要是再搜索尝试中寻找问题的解,当发生不满足求解条件时,就会”回溯“返回(也就是递归返回&am…...

论文阅读:Correcting Motion Distortion for LIDAR HD-Map Localization
目录 概要 Motivation 整体架构流程 技术细节 小结 论文地址:http://arxiv.org/pdf/2308.13694.pdf 代码地址:https://github.com/mcdermatt/VICET 概要 激光雷达的畸变矫正是一个非常重要的工作。由于扫描式激光雷达传感器需要有限的时间来创建…...

Git操作笔记
学git已经好多次了。但是还是会忘记很多的东西,一些常用的操作命令和遇到的bug以后在这边记录汇总下 一.github图片展示 图片挂载,我是创建了一个库专门存图片,然后在github的md中用专用命令展示图片,这样你的md就不会全是文字那…...

使用Python进行数据分析的基本步骤
简介: 在当今的数据驱动世界中,数据分析已成为各行各业不可或缺的一部分。Python作为一种强大的编程语言,提供了丰富的库和工具,使得数据分析变得简单易行。本文将带你了解使用Python进行数据分析的基本步骤。 一、数据获取 从外…...

NGINX优化
NGINX优化分为两个方面: 一. nginx应用配置文件的优化: 1.nginx的性能优化: 全局块: 设置工作进程数: work_processes #设置工作进程数 设置工作进程连接数:work_rilmit_nofile #设置每个worker进程最大可…...

【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】Day 13 题目1:852.山脉数组的峰顶索引思路分析:思路1:暴力枚举O(N)思路2:二分查找O(logN) 题目2:162.寻找峰值思路分析:思路1:二分查找O(logN) 题目1:852.山脉数组的…...

《Python学习》-- 实操篇一
一、文件操作 1. 1 读取文本文件 # 文件操作模式 # r (默认) - 只读模式。文件必须存在,否则会抛出FileNotFoundError。在这种模式下,你只能读取文件内容,不能写入或追加。 # w - 写入模式。如果文件存在,内容会被清空ÿ…...

C# 集合(二) —— List/Queue类
总目录 C# 语法总目录 集合二 List/Queue 1. List2. Queue 1. List List有ArrayList和LinkedList ArrayList 类似数组,查找快,插入删除慢(相对)LinkedList 类似双向链表,查找慢(相对),插入删除快 //ArrayList //ArrayList Arr…...

【TB作品】MSP430 G2553 单片机口袋板,读取单片机P1.4电压显示,ADC
功能 读取P1.4电压,显示到口袋板显示屏,电压越高亮灯越多。 部分程序 while (1){ADC10CTL0 | ENC ADC10SC; // Sampling and conversion startLPM0;adcvalue ADC10MEM; //原始数据 0到1023adtest (float) adcvalue / 1024.…...

知乎x-zse-96、x-zse-81
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章未…...

【Linux】Linux工具——yum,vim
1.Linux 软件包管理器——yum Linux安装软件: 源代码安装(不建议)rpm安装(类似Linux安装包,版本可能不兼容,不推荐,容易报错)yum安装(解决了安装源,安装版本&…...

ES 生命周期管理
一 .概念 ILM定义了四个生命周期阶段:Hot:正在积极地更新和查询索引。Warm:不再更新索引,但仍在查询。cold:不再更新索引,很少查询。信息仍然需要可搜索,但是如果这些查询速度较慢也可以。Dele…...

【JavaScript脚本宇宙】揭秘HTTP请求库:深入理解它们的特性与应用
深度揭秘:六大HTTP请求库的比较与应用 前言 在这篇文章中,我们将探讨六种主要的HTTP请求库。这些库为处理网络请求提供了不同的工具和功能,包括Axios、Fetch API、Request、SuperAgent、Got和Node-fetch。通过本文,你将对每个库…...