把公开装备照片按 EXIF 时间归档,先卡在时区上
手头有一个公开装备照片的小库,约 2400 张,来源是各类公开展览和演训报道,文件格式以 JPG 为主,带完整 EXIF。我的目标很简单:按拍摄时间排序,把同一场活动的照片聚到一起,方便后面查装备细节时快速定位上下文。
第一步先看元数据,用 exiftool 批量导出时间字段:
exiftool -T -FileName -DateTimeOriginal -OffsetTimeOriginal -SubSecTimeOriginal -r ./photos > times.tsv
问题立刻出来了:同一场活动里,有的照片 OffsetTimeOriginal 是 +08:00,有的是空,还有几张是 -05:00。空值的那些 DateTimeOriginal 看上去是当地钟面时间,如果直接按字符串排序,跨时区的照片会插错位置——一次上午的静态展示被排到了下午的动态科目后面。
我的做法是先把时间统一成 UTC。有偏移量的直接减;没有偏移量的,不猜,单独打标:
from datetime import datetime, timedelta, timezone
def to_utc(dt_str, offset):
naive = datetime.strptime(dt_str, "%Y:%m:%d %H:%M:%S")
if not offset:
return None, "no_offset"
sign = 1 if offset[0] == "+" else -1
hh, mm = map(int, offset[1:].split(":"))
tz = timezone(sign * timedelta(hours=hh, minutes=mm))
return naive.replace(tzinfo=tz).astimezone(timezone.utc), "ok"
没偏移量的那部分,我按来源分组单独排,不混进 UTC 序列。这样排序结果至少是自洽的。
为什么这么较真:照片的时间不是我关心的,我要的是「同一时刻的多个视角」。装备照片里经常一张全景一张细节,时间错位会把它们拆到两个活动里,后续查同一件装备的挂载、涂装就断了线索。代价是有一部分照片被隔离出来,不能参与全局排序,约占总数的 8%,这个损失我接受。
失效的地方在相机时钟本身。有几台设备明显没校时,同场景连拍的照片时间戳跳了 20 分钟;还有跨时区转场时没改相机设置的,偏移量写的是出发地。这类错误靠 EXIF 本身修不了,只能按文件名前缀和画面里的光线做人工归组。我踩过一次坑:把一组离线照片的 UTC 排序结果当成拍摄顺序写进了笔记,后来发现相机时钟慢了一小时,整组时间平移,只能回头重排。
现在我的流程是:先跑 exiftool 导出,再按偏移量有无分成两堆,有偏移的进 UTC 排序,没有的手工归组,最后把相机时钟可疑的单独标出来。整个过程不复杂,但时区这一关绕不过去。
你们处理公开照片时,遇到没有偏移量的 EXIF 时间,是直接按本地时间用,还是也单独隔出来?
0 条评论
还没有评论,写下第一条。