roll.json
胶卷就是文件夹。roll.json 躺在里面,只承载文件夹无法表达的东西:身份,以及摄影者对这卷胶片的了解。
{
"version": 1,
"id": "5f1c2b8e-1a4d-4c77-9e0b-3a6f1d2c8e11",
"createdAt": "2026-05-04T10:22:31.004",
"brand": "Kodak",
"model": "Gold 200",
"camera": "Pentax 17",
"lens": "HD Pentax 25mm f/3.5",
"scanner": "Noritsu HS-1800",
"scannedAt": "2026-05-02T00:00:00.000",
"color": "#F2A33C"
}
字段
| 字段 | 类型 | 说明 |
|---|---|---|
version | int | 恒为 1 |
id | string | UUID v4。缺失时重新生成并写回 |
createdAt | string | ISO 8601。缺失时退回文件夹的修改时间 |
name | string | 仅在为空时出现。 见下文 |
brand | string | 胶片品牌,永远是拉丁字母:Kodak,而不是柯达 |
model | string | 胶片型号——Gold 200、Superia X-TRA 400 |
camera | string | 机身。每卷一台 |
lens | string | 由相机档案填入,或手动输入 |
scanner | string | 冲扫店、Plustek,或举着手机对着看片灯 |
scannedAt | string | ISO 8601。底片遇上扫描仪的时刻 |
color | string | #RRGGBB。读取时也接受 RRGGBB 与 #AARRGGBB |
除 version 外全部可选。缺失的字段会从文件夹重建,而不是让整卷加载失败。空字符串视同缺失,不会被写出。
name 字段
起过名的胶卷根本没有 name 字段。文件夹就是答案——这正是在访达里重命名它就等于重命名胶卷的原因。
没起名的胶卷带着 "name": ""。这是文件夹唯一无法表达的东西:它总得有个名字好让文件浏览器显示,于是拿到一个像 Roll 260806 的日期名,而那个空的 name 记下了「没人为它取过名」。Winder 随后会在任何需要一个词的地方顶上胶片的名字,并且不在货架上贴便签。
{ "version": 1, "id": "…", "createdAt": "…", "name": "" }
为什么品牌从不翻译
brand 永远存拉丁名。应用在渲染时才翻译——柯达、富士、乐凯——所以切换界面语言绝不会改写图库,胶片匹配照常工作,文件夹在访达里也依然读得通顺。
只有品牌被翻译。乳剂名是产品名,照印刷原样保留。
胶片与相机的匹配
Winder 用 brand + model 反查胶片目录,用 camera 反查机身目录,忽略大小写、空格与标点,并支持每个条目的别名(中文名与旧产品名)。
于是手动输入的 kodak / gold-200 能白捡到正确的盒子照片;而某款胶片若在后续版本中下架,失去的只是照片,绝不会是名字。匹配结果不会被存储——它每次都从这两个词重新算出来。
器材的继承
胶卷上的相机、镜头与胶片,就是这一卷每一帧对外报告的内容。若某一帧的边车文件写明了自己的器材,则以它为准——那要么是在器材迁移到胶卷之前归档的,要么是有人手动写下的,两种情况都轮不到 Winder 去推翻。
改动其中任意一项,都会重写这一卷上每一帧的 EXIF。
更新于 2026-08-06