各位 V 友好。
平时喜欢带着相机到处跑,同时也是个写 Go 的程序员。每次外拍或者旅行回来,把几千张 RAW 照片导进电脑整理时,总会被照片的地理信息折磨:
折腾了一段时间,自己用 Go 撸了一套专门解决照片导入电脑后“第一公里”的元数据处理工具:photools。目前已经在 GitHub 开源。
整个处理链路设计成了分阶段屏障流水线( Stage Barriers Pipeline ):
[待处理照片 RAW/JPG] ──▶ 1. GPX 轨迹匹配 ──▶ 2. GPS 智能插值 ──▶ 3. 离线逆地理 ──▶ 4. 拍摄日期归档 ──▶ [归档库/YYYY/MMDD/]
-geosync 时间偏移补偿(比如相机慢了 5 秒,直接设 +00:00:05 自动校准);很多时候在景区室内或峡谷拍的照片没命中 GPX 轨迹:
YYYY-MM-DD-basename 并安全移动到 Processed/YYYY/MMDD/;--allow-no-gps),没有 GPS 的照片也会安全归档,并自动生成一份 Markdown 排查清单(Logs/inbox_pending_report_latest.md)。为了让批量处理几十万张 RAW 时不卡顿,做了一些底层优化:
传统脚本慢是因为频繁启动 Perl 进程(单次 30~50ms )。photools 实现了基于管道通信的 StayOpenPool 常驻守护池(exiftool -stay_open True -@ -),单次读取开销压到了 1~2ms,并且支持子进程崩溃自愈。
macOS 客户端用原生 SwiftUI 写的,没有在本地开 HTTP 服务或搞 RPC ,而是把 Go 核心编译成了 libphotools.dylib 动态库,SwiftUI 通过 C-Shared FFI 在进程内直接调用,延迟在 0.1ms 左右。
习惯在终端或 Linux/NAS 跑的同学,也可以直接敲 ./photools tui 启动交互式终端界面:
[1/2/3/4] 快捷键开关插件;[O] 调出插件设置;[S] 全局设置(支持 [Tab] 路径补全);[Enter] 预检与执行。项目完全开源,没有商业化诉求,主要是为了解决自己和身边摄影朋友的实际整理痛点。
如果你也是相机常客、对照片元数据/GPS 轨迹有强迫症,欢迎试用、提 Issue 或 PR !
exiftool(brew install exiftool)这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.