本文目录导读:

我来为您提供几种批量修改照片地理位置的脚本方案。
使用 Python + exif库 (最常用)
安装依赖
pip install pillow piexif
批量修改GPS坐标脚本
import os
import piexif
from PIL import Image
import shutil
def convert_to_dms(coord):
"""将十进制度数转换为度分秒格式"""
degrees = int(coord)
minutes_decimal = (coord - degrees) * 60
minutes = int(minutes_decimal)
seconds = (minutes_decimal - minutes) * 60
return ((degrees, 1), (minutes, 1), (int(seconds * 1000), 1000))
def batch_modify_gps(folder_path, latitude, longitude, backup=True):
"""
批量修改照片GPS信息
Args:
folder_path: 照片文件夹路径
latitude: 纬度 (十进制,如 39.9042)
longitude: 经度 (十进制,如 116.4074)
backup: 是否备份原文件
"""
# 创建备份文件夹
if backup:
backup_folder = os.path.join(folder_path, "backup")
os.makedirs(backup_folder, exist_ok=True)
# 转换坐标格式
lat_dms = convert_to_dms(abs(latitude))
lon_dms = convert_to_dms(abs(longitude))
# 判断南北纬和东西经
lat_ref = "N" if latitude >= 0 else "S"
lon_ref = "E" if longitude >= 0 else "W"
# 遍历文件夹
count = 0
for filename in os.listdir(folder_path):
if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.tiff')):
filepath = os.path.join(folder_path, filename)
try:
# 备份原文件
if backup:
shutil.copy2(filepath, os.path.join(backup_folder, filename))
# 读取图片
img = Image.open(filepath)
# 获取现有exif数据
exif_dict = piexif.load(img.info.get("exif", b""))
# 设置GPS信息
gps_ifd = {
piexif.GPSIFD.GPSLatitudeRef: lat_ref,
piexif.GPSIFD.GPSLatitude: lat_dms,
piexif.GPSIFD.GPSLongitudeRef: lon_ref,
piexif.GPSIFD.GPSLongitude: lon_dms,
}
exif_dict["GPS"] = gps_ifd
# 保存修改后的图片
exif_bytes = piexif.dump(exif_dict)
img.save(filepath, "jpeg", exif=exif_bytes)
count += 1
print(f"✓ 已修改: {filename}")
except Exception as e:
print(f"✗ 处理 {filename} 时出错: {str(e)}")
print(f"\n完成! 共修改 {count} 张照片")
if backup:
print(f"原文件备份在: {backup_folder}")
# 使用示例
if __name__ == "__main__":
# 设置参数
folder = r"C:\你的照片文件夹路径"
lat = 39.9042 # 北京天安门纬度
lon = 116.4074 # 北京天安门经度
# 执行批量修改
batch_modify_gps(folder, lat, lon, backup=True)
使用 exiftool (更强大的工具)
安装 exiftool
- Windows: 下载并安装 ExifTool
- macOS:
brew install exiftool - Linux:
sudo apt-get install exiftool
批量修改脚本
#!/bin/bash
# batch_modify_gps.sh
# 设置新坐标 (十进制)
LATITUDE="39.9042"
LONGITUDE="116.4074"
# 照片文件夹路径
PHOTO_DIR="./photos"
# 遍历所有jpg文件
for photo in "$PHOTO_DIR"/*.jpg; do
if [ -f "$photo" ]; then
echo "处理: $photo"
# 使用exiftool修改GPS信息
exiftool \
-GPSLatitude="$LATITUDE" \
-GPSLatitudeRef="${LATITUDE:0:1}" \
-GPSLongitude="$LONGITUDE" \
-GPSLongitudeRef="${LONGITUDE:0:1}" \
-GPSPosition="$LATITUDE $LONGITUDE" \
-overwrite_original \
"$photo"
fi
done
echo "批量修改完成!"
带GUI界面的版本 (使用 tkinter)
import tkinter as tk
from tkinter import filedialog, messagebox
import os
import piexif
from PIL import Image
import shutil
class GPSModifierGUI:
def __init__(self):
self.root = tk.Tk()
self.root.title("批量修改照片GPS位置")
self.root.geometry("500x400")
# 文件夹选择
tk.Label(self.root, text="选择照片文件夹:").pack(pady=5)
self.folder_path = tk.StringVar()
tk.Entry(self.root, textvariable=self.folder_path, width=50).pack()
tk.Button(self.root, text="浏览", command=self.select_folder).pack(pady=5)
# 纬度输入
tk.Label(self.root, text="纬度 ( 39.9042):").pack(pady=5)
self.lat_entry = tk.Entry(self.root, width=20)
self.lat_entry.pack()
# 经度输入
tk.Label(self.root, text="经度 ( 116.4074):").pack(pady=5)
self.lon_entry = tk.Entry(self.root, width=20)
self.lon_entry.pack()
# 备份选项
self.backup_var = tk.BooleanVar(value=True)
tk.Checkbutton(self.root, text="备份原文件", variable=self.backup_var).pack(pady=5)
# 执行按钮
tk.Button(self.root, text="批量修改", command=self.execute_modify,
bg="green", fg="white", width=20).pack(pady=20)
# 日志显示
self.log_text = tk.Text(self.root, height=10, width=60)
self.log_text.pack(pady=10)
def select_folder(self):
folder = filedialog.askdirectory()
if folder:
self.folder_path.set(folder)
def log(self, message):
self.log_text.insert(tk.END, message + "\n")
self.log_text.see(tk.END)
self.root.update()
def execute_modify(self):
folder = self.folder_path.get()
if not folder:
messagebox.showerror("错误", "请选择文件夹")
return
try:
lat = float(self.lat_entry.get())
lon = float(self.lon_entry.get())
except ValueError:
messagebox.showerror("错误", "请输入有效的经纬度")
return
backup = self.backup_var.get()
self.log("开始批量修改...")
self.log(f"文件夹: {folder}")
self.log(f"新坐标: {lat}, {lon}")
# 转换坐标
def convert_to_dms(coord):
degrees = int(coord)
minutes = int((coord - degrees) * 60)
seconds = ((coord - degrees) * 60 - minutes) * 60
return ((degrees, 1), (minutes, 1), (int(seconds * 1000), 1000))
lat_dms = convert_to_dms(abs(lat))
lon_dms = convert_to_dms(abs(lon))
lat_ref = "N" if lat >= 0 else "S"
lon_ref = "E" if lon >= 0 else "W"
# 备份文件夹
if backup:
backup_folder = os.path.join(folder, "backup")
os.makedirs(backup_folder, exist_ok=True)
count = 0
for filename in os.listdir(folder):
if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.tiff')):
filepath = os.path.join(folder, filename)
try:
if backup:
shutil.copy2(filepath, os.path.join(backup_folder, filename))
img = Image.open(filepath)
exif_dict = piexif.load(img.info.get("exif", b""))
gps_ifd = {
piexif.GPSIFD.GPSLatitudeRef: lat_ref,
piexif.GPSIFD.GPSLatitude: lat_dms,
piexif.GPSIFD.GPSLongitudeRef: lon_ref,
piexif.GPSIFD.GPSLongitude: lon_dms,
}
exif_dict["GPS"] = gps_ifd
exif_bytes = piexif.dump(exif_dict)
img.save(filepath, "jpeg", exif=exif_bytes)
count += 1
self.log(f"✓ {filename}")
except Exception as e:
self.log(f"✗ {filename}: {str(e)}")
self.log(f"\n完成! 共修改 {count} 张照片")
messagebox.showinfo("完成", f"成功修改 {count} 张照片的GPS信息")
if __name__ == "__main__":
app = GPSModifierGUI()
app.root.mainloop()
使用说明
方法1 (Python脚本):
- 安装Python和所需库
- 修改脚本中的文件夹路径和经纬度
- 运行脚本
方法2 (exiftool):
- 安装exiftool
- 修改脚本中的坐标和路径
- 运行bash脚本
方法3 (GUI版本):
- 直接运行,选择文件夹和输入坐标
- 点击"批量修改"按钮
注意事项
⚠️ 重要提示:
- 建议先备份原文件
- 修改GPS信息可能违反某些平台的使用条款
- 请确保您有权修改这些照片的元数据
- 不同格式照片处理方式可能不同
您可以根据需求选择合适的方法,如果需要其他功能(如从文件中读取坐标、随机生成坐标等),我可以进一步修改脚本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播