EXIF 驱动的照片管理系统

把 Adobe Bridge 里维护的照片元数据,直接变成个人网站的数据库:分类、城市、年份、地图、精选与灯箱说明都从图片本身流向网页。

这套系统的核心想法很简单:照片文件本身就是数据库。

我不再把图片、地点、年份、题材分别维护在一堆表格或页面配置里,而是把长期有效的信息写回照片的 EXIF/IPTC/XMP 元数据中。Bridge 负责做我熟悉的图片管理,网站生成脚本负责读取这些信息,把它们转换成静态网页需要的 JSON 和 HTML。

从 Bridge 到网站

日常维护从 dist/assets/original/ 开始。这里保存的是网站图片管线的源文件,也是我会在 Bridge 中直接修改元数据的地方。

我在 Bridge 中校正拍摄时间、城市、子位置、关键词等信息。修改完成后运行:

npm run update

脚本会重新读取原图中的 EXIF/IPTC/XMP,生成 photo-data.jsonmap-data.jsoncities.json,再重建首页、摄影页、地图页和探索页。

如果新增或替换了图片内容,则先运行图片管线:

npm run images
npm run update

这一步会从源图生成网站实际使用的 largethumbshero 版本。原图短边保持 2160px 级别,网页网格继续使用 720px 缩略图,灯箱使用大图。

元数据约定

这套系统真正稳定下来,靠的是少量清晰的字段约定。

拍摄时间来自 DateTimeOriginal,如果缺失则依次尝试 CreateDateDateCreatedModifyDate。网站上的年份筛选、时间排序和 caption 年份都从这里来。

地点使用 City 作为城市,使用 Sub-locationLocation 作为子位置。网页中的地点说明会组合成类似:

2025 · 南京 · 保利大剧院

题材来自关键词中的一级分类,比如 城市风光动物生态建筑胶片摄影。摄影页的分类按钮就从这些一级关键词统计出来。

如果一级分类是 动物生态,关键词中带 # 的二级标签会被当作物种名称。比如 动物生态 + #蓑羽鹤,网页显示时会优先变成:

2026 · 蓑羽鹤

这个规则让动物照片不必被城市信息抢走展示重点。

单一真相源

最终生成的 dist/data/photo-data.json 是全站图片的单一真相源。首页、摄影页、地图页、城市页、灯箱展示都会从这里读取同一份信息。

每张照片会被整理成类似这样的结构:

{
  "name": "B0005433 copy.webp",
  "category": "城市风光",
  "year": 2025,
  "city": "南京",
  "subLocation": "保利大剧院",
  "caption": "2025 · 南京 · 保利大剧院",
  "thumb": "assets/thumbs/B0005433 copy.webp",
  "large": "assets/large/B0005433 copy.webp"
}

这意味着我只需要在一个地方校正元数据,就能让多个页面同时更新。分类筛选、城市筛选、地图 marker、灯箱说明、精选 caption 都不会各写一遍。

地图不再依赖文件名

旧式图库常常会从文件夹名、文件名、GPS 坐标或手填 JSON 中猜地点。现在地图页主要依赖 City 字段。

脚本会统计所有照片里的城市,生成新的城市列表;地图上的城市点、照片墙里的城市分组、城市筛选页都来自同一套城市数据。对于没有 GPS 的照片,只要城市名在 content/city-coordinates.json 中有坐标,就能参与地图展示。

这样做的好处是:位置语义由我在 Bridge 里维护,地图坐标只负责呈现,不再决定照片属于哪里。

精选与 Hero 是策展层

并不是所有内容都应该完全自动化。

摄影页和地图页适合从全量数据生成,但首页 Hero 和精选更像策展层。它们通过 content/hero-list.jsoncontent/home-featured.json 固定选择图片。图片本身的标题、年份、地点、题材仍然来自 EXIF,但“哪些图上首页、以什么顺序出现、描述写什么”由我手动决定。

这让系统保持两种速度:图库可以频繁更新,首页精选可以慢慢编辑。

我认为的创新点

这套系统不是一个重型 DAM,也不是一个传统 CMS。它更像是一条个人影像档案的轻量生产线。

Bridge 是入口,EXIF 是长期数据层,Node.js 脚本是转换器,静态网站是展示端。所有关键数据都跟随图片文件本身移动,网站只是把这些信息重新组织出来。

它的优点是可迁移、可解释、低维护。即使以后不用这个网站,照片里的时间、城市、位置和关键词仍然存在;即使不打开 Bridge,网站也能把这些元数据变成地图、筛选器、caption 和精选页面。

我喜欢这套方法的地方在于,它把“整理照片”和“更新网站”合并成了一件事。只要照片档案本身变得更准确,网站就会自动变得更准确。

← 返回探索