为图片设置经纬度信息

一、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之数据库字段约束学习笔记(三)

MySQL 中的字段约束用于限制字段的取值范围,确保数据的一致性和完整性。常见的字段约束包括: PRIMARY KEY:定义主键约束,唯一标识表中的每一行数据。FOREIGN KEY:定义外键约束,确保两个表之间的关联完整性…

Python 介绍

python 发展简史 Python 起源(1989-1991) Python的诞生可以追溯到1989年,当时Guido van Rossum在荷兰国家数学和计算机科学研究所工作时,出于对当时编程语言的不满,开始构思一种新的编程语言。他希望这种语言能够弥补C…

【Python】使用 Pandas 统计每行数据中的空值

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 🎵 邓紫棋《光年之外》 在数据分析…

传感器的基本特性

传感器的基本特性主要包括以下几个方面: 静态特性:这是指传感器在被测量的各个值处于稳定状态时的输入和输出关系。传感器的静态特性可以用一些静态性能指标来衡量,主要包括线性度、灵敏度、迟滞、重复性、漂移和分辨力等。其中,线…

Python 网络爬虫:深入解析 Scrapy

大家好,在当今数字化时代,获取和分析网络数据是许多项目的关键步骤。从市场竞争情报到学术研究,网络数据的重要性越来越被人们所认识和重视。然而,手动获取和处理大量的网络数据是一项繁琐且耗时的任务。幸运的是,Pyth…

vue3 todolist 简单例子

vue3 简单的TodList 地址: https://gitee.com/cheng_yong_xu/vue3-composition-api-todo-app-my 效果 step-1 初始化项项目 我们不采用vue cli 搭建项目 直接将上图文件夹,复制到vscode编辑器,清空App.vue的内容 安装包 # 安装包 npm…

云原生架构案例分析_2.云原生技术助力某汽车公司数字化转型实践

名词解释: 互联网 在“互联网”模式下,我们仅仅把互联网看作是一种传播工具、传播手段、传播渠道和传播平台,对于互联网的应用大体上是在既有的运作逻辑的基础之上,把互联网作为延伸传媒影响力、价值和功能的一种延伸型工具&…

Linux基础1-基本指令1

1.Linux学习前言 Linux的学习非常重要,我们学习Linux的第一步是在电脑中搭建Linux环境。 对于没有搭建过的可以看这阿伟t的一篇文章 【Linux入门】Linux环境配置-CSDN博客 我的环境为XShell,运行的云服务器是阿里云 2.本章重点 1.显示当前目录下的所有文件…

iperf

文章目录 1.安装1.1在 Ubuntu 上安装1.2在 CentOS 上安装 2.iperf服务端选项3.iperf客户端选项4.iperf常用命令5.结果展示5.1 tcp结果展示5.2 udp结果展示 Iperf是一款基于TCP/IP和UDP/IP的网络性能测试工具,它可以用来测量网络带宽和网络质量,还可以提供…

针对大模型的上下文注入攻击

大型语言模型(LLMs)的开发和部署取得了显著进展。例如ChatGPT和Llama-2这样的LLMs,利用庞大的数据集和Transformer架构,能够产生连贯性、上下文准确性甚至具有创造性的文本。LLMs最初和本质上是为静态场景设计的,即输入…

asio之winsock的初始化

简介 asio中,winsock初始化工作是放在winsock_init类中来处理的 类结构 #mermaid-svg-aC4x3cdr8TKGhsnX {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aC4x3cdr8TKGhsnX .error-icon{fill:#552222;}#…

Xilinx RFSOC 47DR 8收8发 信号处理板卡

系统资源如图所示:  FPGA采用XCZU47DR 1156芯片,PS端搭载一组64Bit DDR4,容量为4GB,最高支持速率:2400MT/s;  PS端挂载两片QSPI X4 FLASH;  PS支持一路NVME存储;  PS端挂载SD接口,用于存储程序&…

解决kettle界面右上角的connect消失——且使用admin登录不上Kettle资源库

一、问题描述 1.1、Kettle界面右上角的connect消失了 当我们配置Kettle界面的资源库(Other Repositories)内容后,Kettle界面右上角的connect消失了;如下图所示: 1.2、使用默认的账户【admin】和密码【admin】登录不上kettle资源库 当我们切换到我们配置的数据库使用超管账…

uniapp实现微信小程序调用云函数【vue3】

本人是从微信开发者工具写原生微信小程序一步一步走来,由于vue3框架的慢慢的步入前端市场,为了不被前端市场遗弃,果断从vue2开始步入vue3的学习,本人习惯在在HBuilder X写uniapp的项目,过去uniapp默认vue2框架&#xf…

注册北京个体工商户条件和办理时间

在北京这座充满活力的城市中,每天都有无数的创业者怀揣着梦想,踏上创业之路。然而,对于许多初次接触企业注册的人来说,往往对注册流程和时间感到困惑。特别是选择代理服务时,更希望了解一个大概的时间范围。那么&#…

WHAT - 容器化系列(二)- docker

目录 一、前言二、Docker镜像:可运行软件包三、Docker容器:可执行环境四、容器和镜像的关系五、创建镜像的过程5.1 编写Dockerfile5.2 构建Docker镜像5.3 查看构建的镜像5.4 运行Docker容器5.5 验证容器运行状态5.6 推送镜像到镜像仓库(可选&…

【案例实操】银河麒麟桌面操作系统实例分享,V10SP1重启后网卡错乱解决方法

1.问题现象 8 个网口, 命名从 eth1 开始到 eth8。 目前在系统 grub 里面加了 net.ifnames0 biosdevname0 参数, 然后在 udev 规则中加了一条固定网卡和硬件 pci 设备号的规则文件。 最后在 rc.local 中加了两条重新安装网卡驱动的命令( rmmod…

Spring 中如何控制 Bean 的加载顺序?

如果你脱口而出说添加 Order 注解或者是实现 Ordered 接口,那么恭喜,你掉坑了。 一 Order 注解和 Ordered 接口 在 Spring 框架中,Order 是一个非常实用的元注解,它位于 spring-core 包下,主要用于控制某些特定上下文…

【模型参数微调】最先进的参数高效微调 (PEFT) 方法

简介 由于大型预训练模型的规模,微调大型预训练模型的成本通常高得令人望而却步。参数高效微调 (PEFT) 方法只需微调少量(额外)模型参数而不是所有模型参数,即可使大型预训练模型有效地适应各种下游应用。这大大降低了计算和存储成本。最近最先进的PEFT技术实现了与完全…

git基本使用——回退,撤销add,commit,合并分支

学习笔记 笔记中表格中的—— 表示需要回退的地方,也就是使用命令之后会改变的地方 网页软件分享 这是一个非常好用web端笔记画图软件,解决了typora画图不方便的问题