nord342/photo-metadata-stripper
GitHub: nord342/photo-metadata-stripper
一款本地照片元数据清理工具,批量移除隐藏信息以保护隐私。
Stars: 0 | Forks: 0
# photo-metadata-stripper
在将照片分享到网上之前,移除 EXIF 数据、GPS 坐标、相机信息以及所有隐藏元数据 —— **100% 本地处理,不上传任何内容。**
```
python3 strip.py --source ./photos
```
每张手机拍摄的照片都嵌入了隐形元数据:你的 **精确 GPS 坐标**、设备型号、时间戳,有时甚至包括姓名。此脚本可一键清除所有内容。
## 照片中隐藏了什么
你可能没有意识到,但每一张 JPEG 都包含如下数据:
| 字段 | 示例 | 风险 |
|---|---|---|
| **GPS 纬度/经度** | 51.5074, -0.1278 | **你的精确位置** — 精确到米 |
| **原始日期/时间** | 2026:04:15 09:23:41 | 你当时所在的时间 |
| **相机型号** | iPhone 16 Pro Max | 识别你的设备 |
| **序列号** | C8QH6T0GPX | 仅属于该设备的唯一标识 |
| **作者/所有者** | John Smith | 设备设置中的你的名字 |
| **软件** | iOS 19.4.1 | 你的操作系统版本 |
| **镜头型号** | iPhone 16 Pro Max 后置摄像头 | 硬件指纹 |
将照片上传到不清理元数据的论坛、二手平台或社交网站(很多平台不会自动清理)后,任何人都可以下载并看到你居住、工作或旅行的确切位置。
## 功能特性
- **清除所有元数据** — EXIF、GPS、IPTC、XMP、ICC 配置文件、缩略图、制造商注释等全部移除
- **审核模式** — 在清除前查看嵌入的完整数据;对隐私风险字段以红色高亮显示
- **GPS 提取** — 显示精确坐标并提供可点击的 Google Maps 链接,直观展示数据的危险性
- **批量处理** — 一条命令即可清理整个文件夹的照片
- **保留原始文件** — 默认将清理后的副本保存到 `clean/` 子文件夹中
- **原地模式** — 确认后可直接覆盖原文件(`--in-place`)
- **JSON 输出** — 可将审核报告输出为 JSON,便于脚本或 CI 工具处理
- **跳过已清理文件** — 若照片无元数据,直接复制而不重新处理
- **仅一个依赖** — 仅需 [Pillow](https://pillow.readthedocs.io/)
- **完全离线** — 不会上传任何数据(这违背了本工具的初衷)
## 安装
```
pip install Pillow
```
这是唯一的依赖。Python 3.8+ 版本。
## 使用方法
### 清理文件夹中所有照片的元数据
```
python3 strip.py --source ./photos
```
清理后的副本保存到 `./photos/clean/`。原始文件保持不变。
### 先审核再清理(查看元数据但不修改)
```
python3 strip.py --source ./photos --audit
```
输出彩色编码的报告,展示所有嵌入字段 — GPS 坐标会附带可点击的 Google Maps 链接。
### 清理单张图片
```
python3 strip.py --image vacation.jpg
```
清理后的副本保存到 `./clean/vacation.jpg`。
### 原地清理(覆盖原文件)
```
python3 strip.py --source ./photos --in-place
```
⚠️ **不可恢复** — 原文件将被覆盖。确认无误后再使用。
### 自定义输出文件夹
```
python3 strip.py --source ./photos --output ~/Desktop/clean-photos
```
### 生成 JSON 审核报告
```
python3 strip.py --source ./photos --audit --json > report.json
```
输出结构化 JSON 报告,适用于 CI、自动化流程或与其他工具集成。
## 示例:审核输出
```
==============================================================
photo-metadata-stripper — AUDIT REPORT
==============================================================
⚠️ vacation_beach.jpg
🔴 Camera Make: Apple
🔴 Camera Model: iPhone 16 Pro Max
🔴 Date/Time Original: 2026:03:15 14:22:31
🔴 Artist / Owner: John Smith
🔴 Software: iOS 19.4.1
🔴 Serial Number: C8QH6T0GPX
Focal Length: 6.765
Exposure Time: 0.0025
📍 GPS DATA FOUND
🔴 GPS Latitude: (51, 30, 26.64)
🔴 GPS Longitude: (0, 7, 40.08)
📍 EXACT LOCATION: 51.507400, -0.127800
🗺️ Google Maps: https://www.google.com/maps?q=51.5074,-0.1278
✅ screenshot.png — CLEAN (no metadata found)
==============================================================
SUMMARY
Files scanned : 2
With EXIF metadata : 1
With GPS coordinates : 1
Privacy-risky fields : 7
⚠️ WARNING: 1 photo(s) contain your exact GPS location.
Run without --audit to strip all metadata before sharing.
==============================================================
```
## 示例:清理输出
```
Source : /Users/you/photos
Output : /Users/you/photos/clean
Files : 5
[1/5] vacation_beach.jpg — STRIPPED (14 tags removed) (GPS: 51.5074, -0.1278 REMOVED)
[2/5] selfie.jpg — STRIPPED (11 tags removed)
[3/5] product_shot.jpg — STRIPPED (8 tags removed)
[4/5] screenshot.png — already clean, skipping
[5/5] sunset.jpg — STRIPPED (12 tags removed) (GPS: 34.0195, -118.4912 REMOVED)
==================================================
Done.
Stripped : 4
Clean : 1
Errors : 0
Output : /Users/you/photos/clean
```
## 所有参数
| 参数 | 缩写 | 默认值 | 描述 |
|---|---|---|---|
| `--image` | `-i` | — | 单个要处理的图像文件 |
| `--source` | `-s` | — | 要批量处理的图像文件夹 |
| `--output` | `-o` | `clean/`(源文件同级) | 清理后图片的输出文件夹 |
| `--audit` | `-a` | `False` | 仅显示元数据,不做任何修改 |
| `--in-place` | | `False` | 直接覆盖原文件(不可恢复) |
| `--json` | | `False` | 以 JSON 格式输出审核报告 |
| `--no-colour` | | `False` | 禁用彩色输出 |
`--image` 与 `--source` 互斥,请选择其中一项使用。
## 支持格式
`.jpg` `.jpeg` `.png` `.tiff` `.tif` `.webp`
## 适用人群
- 🔒 **注重隐私的用户** — 在线分享照片前移除位置数据
- 📰 **记者** — 保护消息来源位置和设备身份
- ✊ **活动人士** — 从抗议或实地拍摄的照片中移除 GPS 轨迹
- 📸 **摄影师** — 在交付客户前清除相机序列号与设置信息
- 🛒 **二手卖家** — 从商品照片中移除家庭 GPS 坐标
- 🏢 **企业** — 防止员工设备数据在营销照片中泄露
- 👨💻 **开发者** — 在 CI/CD 中集成,自动清理上传图片的元数据
## 工作原理
该脚本并非简单删除 EXIF 头,而是 **从原始像素数据重新生成图像**。这确保了:
- 所有 EXIF、IPTC、XMP 元数据被彻底移除
- 可能包含 GPS 数据的嵌入缩略图被移除
- ICC 色彩配置文件被移除
- 相机特定的专有数据(Maker Notes)被移除
- 输出图像在像素层面与原始完全一致 —— 仅不可见的元数据被清除
## 使用建议
- **先审核后清理**:使用 `--audit` 查看即将清除的内容,特别是 GPS 坐标
- **Google Maps 链接**:审核报告中的链接会打开照片的精确位置,可亲自验证 EXIF GPS 数据的精确程度
- **社交媒体差异**:Instagram、Twitter/X、Facebook 上传时会自动清理元数据,但许多论坛、二手平台(如 Craigslist、eBay)、约会应用和消息平台 **不会**
- **截图通常已清理**:该脚本能自动跳过已无元数据的图片
- **先备份**:使用 `--in-place` 时,原文件无法恢复
## 许可证
[MIT](LICENSE) — 可自由使用、修改和分发。
## 贡献
欢迎提交问题和 Pull Request。若某类元数据格式未被正确检测或清除,请提供示例文件并提交问题。
标签:EXIF剥离, GPS脱敏, SEO: 本地EXIF剥离, SEO: 清除GPS坐标, SEO: 照片元数据清理, SEO: 相机信息去除, SEO: 隐私保护工具, 元数据审计, 元数据清理, 图片隐私, 安全分享, 审计模式, 批量处理, 数据清理, 本地处理, 照片去定位, 相机信息清除, 网络安全, 逆向工具, 隐私保护