本文目录导读:

我来为您提供几种批量修改照片地理位置的脚本方案。
使用 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信息可能违反某些平台的使用条款
- 请确保您有权修改这些照片的元数据
- 不同格式照片处理方式可能不同
您可以根据需求选择合适的方法,如果需要其他功能(如从文件中读取坐标、随机生成坐标等),我可以进一步修改脚本。