批量修改照片地理位置的脚本

wen 实用脚本 3

本文目录导读:

批量修改照片地理位置的脚本

  1. 使用 Python + exif库 (最常用)
  2. 使用 exiftool (更强大的工具)
  3. 带GUI界面的版本 (使用 tkinter)
  4. 使用说明
  5. 注意事项

我来为您提供几种批量修改照片地理位置的脚本方案。

使用 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脚本):

  1. 安装Python和所需库
  2. 修改脚本中的文件夹路径和经纬度
  3. 运行脚本

方法2 (exiftool):

  1. 安装exiftool
  2. 修改脚本中的坐标和路径
  3. 运行bash脚本

方法3 (GUI版本):

  1. 直接运行,选择文件夹和输入坐标
  2. 点击"批量修改"按钮

注意事项

⚠️ 重要提示

  • 建议先备份原文件
  • 修改GPS信息可能违反某些平台的使用条款
  • 请确保您有权修改这些照片的元数据
  • 不同格式照片处理方式可能不同

您可以根据需求选择合适的方法,如果需要其他功能(如从文件中读取坐标、随机生成坐标等),我可以进一步修改脚本。

抱歉,评论功能暂时关闭!