chawasit/rewindpix-tools
GitHub: chawasit/rewindpix-tools
一个 RewindPix 胶片模拟相机的非官方浏览器工具,通过相机 WiFi API 实现照片浏览下载、浏览器内胶片 LUT 冲洗、解锁胶卷帧数限制及设置相机时钟等功能。
Stars: 0 | Forks: 0
# RewindPix 工具
小巧、无依赖的**浏览器应用 + 工具**,专为 **RewindPix** 胶片模拟相机
(**Novatek NT96565**,型号 PS135)设计——这是一个社区驱动的开源**替代方案,用于取代官方 RewindPix
应用**,它通过相机本地的 WiFi HTTP API 与相机通信。在任何手机或电脑上均可使用(无需安装应用):
浏览并**下载你的照片**,在浏览器中使用相机的 LUTs **冲洗胶片质感**,并
**解锁胶卷容量**,突破原生 36 张的限制。
这里的所有内容均为静态 HTML + 原生 JS(冲洗使用 WebGL),旨在**在本地运行或由
相机自身通过纯 HTTP** 提供(不是 HTTPS —— 见下文)。可通过**添加到主屏幕**(manifest + 图标)作为独立应用安装。本仓库仅包含源代码;没有托管网站。
**单文件构建:** [`rewindpix.html`](rewindpix.html) 是整个应用打包在一个**独立文件**中
(约 1 MB)—— 包含 4 个标签页 + 内联的 CSS/JS/图标,以及 **3 个备用 LUTs**,因此它可以独立运行。打开即用,无需文件夹。如果在旁边放置一个 `luts/` 文件夹(或放在相机的 SD 卡上),冲洗功能将获得全部 **36 个 LUTs**;自定义 LUTs 可从冲洗或图库中上传。使用 `python build.py` 重新构建。如果将其安装在相机的
**子文件夹**(`A:\RewindPix\`)中,顶部栏的 **⟳ 更新** 可以通过**两步**从 GitHub 进行自更新——点击它即可
**下载**最新版本(需要联网),然后**重新连接相机的 WiFi**并点击 **⤒ 完成更新**将其上传,因此你永远不需要同时连接两个网络。**图库 → 同步 LUTs** 可为 `luts/`
文件夹补充内容(这依然需要同时联网 + 相机的 WiFi——例如使用手机移动网络)。安装在根目录下无法自更新,因为相机会丢弃根目录的上传。
## 它的用途
- **RewindPix 应用的非官方替代/更换方案** —— 加入相机的 WiFi,即可从手机或
笔记本电脑浏览、预览并**下载你的照片**(支持单张、多选或整卷打包为 ZIP)—— 无需 Android 应用。
- **解锁最大胶卷容量** —— 官方应用将一卷限制在 **36 张**;**预设**标签页
可将相机的帧数配额(*最大照片数*)设置为你**输入的任何值**(`cmd=8004`;快捷设置
24/36/99,`0` 清除胶卷),因此你可以拍摄**比应用允许的更长的胶卷**。
- **自行冲洗胶片质感** —— 在浏览器(WebGL)中应用 **36 个内置胶片 HALD-CLUT LUTs**(或你自己的)外加 7 个颜色参数,并保存回相机或你的设备。
- **编辑胶片槽位与预设** —— 重命名 3 个胶片 / 3 个机内槽位,调整参数,保存/恢复
预设集合,并以 LUT 的名称命名槽位以便自动预览。
- **设置相机时钟** —— 相机**没有屏幕菜单**,且官方应用从不设置其
日期/时间,因此照片可能会被打上错误/重置的时钟标记。**预设**标签页可将你设备的
当前日期 + 时间(或你输入的值)推送到相机的 RTC(`cmd=3005`/`3006`)—— 这是目前已知唯一的修复方法
(在此发现;已通过实机验证)。
## 工具
| 工具 | 功能 |
|------|--------------|
| **[图库 + 同步](src/index.html)** — `src/index.html` | 应用主页。连接相机,按文件夹浏览照片(**全部 · 当前胶片 · 原始胶片 · 机内模式**),支持时间戳过滤 + 分页。**点击照片 → 全屏查看器**(滑动 / 箭头,冲洗或下载)。**当前胶片**视图显示实时胶卷的 `._FILM` 工作副本,每张都会**根据其文件名中命名的 LUT 进行自动预览**(若无匹配则显示 RAW 徽章)。**选择**相框以进行**下载**(单独下载或打包为 ZIP)或**删除**它们(需确认)。**完成胶卷**会安全双重删除当前胶卷的工作副本并重置帧数配额。 |
| [冲洗](src/develop.html) | 在浏览器(WebGL)中应用**胶片 HALD-CLUT LUT** + 7 个参数(亮度、对比度、RGB 增益、色调、饱和度),带有**实时处理指示器**,并导出全分辨率 JPEG。通过**从相机选取**、从图库选取或文件上传来加载照片;文件名中嵌入了 LUT 名称的相机照片(例如 `…GLVIVID_0003.JPG`)在加载时会**自动选择该 LUT**。**上传你自己的 LUT**(HALD `.png`)。**保存到相机**会写入 `DCIM/Developed_Photos`(已通过 `cmd=3015` 目录验证;若无权限则回退到设备下载)。 |
| [预设](src/presets.html) | 编辑相机的 3 个**胶片**槽位(名称 + 7 个参数)和 3 个**机内**槽位(覆盖 / 保留内置),**设置胶卷大小**(帧数配额),**设置相机时钟**(推送你设备的日期/时间 —— `cmd=3005/3006`;由于相机没有菜单且应用从不执行此操作,这是唯一的办法),应用到相机,并保存预设。**以 LUT 命名胶片槽位**(`LUT ▾` 选择器),使得在该槽位拍摄的照片能在图库中自动使用匹配的 LUT 进行预览。每个槽位都会显示实时**示例** —— 选择**示例照片**:**颜色图表**(默认)、内置样张或**从图库中选择一张**(相机拍摄);以 LUT 命名的槽位会有一个 **↺ 默认值**按钮,用于重置 7 个参数(官方 LUTs 专为默认值调校)。 |
| [图库](src/library.html) | 管理 **LUTs** —— 列出内置(带有官方**预览缩略图**)+ 自定义的 LUTs,进行上传、删除,以及从 GitHub **同步 LUTs** 到相机的 `luts/` 文件夹中(增量同步)。**备份 / 恢复预设**(导出 / 导入 token,清除所有)。 |
## 仓库布局
- **`rewindpix.html`** —— 构建后的、可发布的**单文件**(直接打开,或安装在相机的 SD 卡上)。
- **`src/`** —— 多文件源代码:4 个页面(`index`/`develop`/`presets`/`library`.html)+ JS(`camera.js`, `app.js`, `zip.js`, `develop.js`, `presets-ui.js`, `library.js`),`style.css`,图标,`manifest.webmanifest`,以及 `luts/`(36 个 HALD-CLUT PNG 文件)。
- **`build.py`** —— 将 `src/` 打包 -> `rewindpix.html`。**`dev-server.py`** —— 本地静态服务器 + 相机代理(`--mock` = 无相机模式)。
## 如何使用
*日常使用方式 —— 你只是想使用你的相机。整个应用就是一个文件,`rewindpix.html`。*
1. **将应用放到你的相机上。** 关闭相机,取出 SD 卡,并将其插入你的
电脑。在卡上创建一个名为 **`RewindPix`** 的文件夹,并将 **`rewindpix.html`** 复制到其中(这样
它就位于 `RewindPix/rewindpix.html`)。为了使用全部 36 种胶片效果,还要把 **`luts`** 文件夹复制到
旁边。弹出 SD 卡,将其放回相机,然后打开相机。
2. **将你的手机连接到相机的 WiFi。** 打开相机的 WiFi(与官方
RewindPix 应用使用的相同的 WiFi),然后在手机上打开 WiFi 设置并加入相机的网络。
3. **打开应用。** 在你手机的浏览器中,访问
**`http://192.168.1.254/RewindPix/rewindpix.html`**。*(提示:使用浏览器的**添加到主屏幕**功能,这样下次它就能像普通应用一样打开了。)*
4. **浏览并保存你的照片。** **图库**会显示你拍摄的照片 —— 点击一张可全屏查看,然后
**下载 ⤓** 将其保存到你的手机。使用**选择**一次性抓取多张,或者使用**全部下载**
下载整卷胶卷。
5. **为照片赋予胶片质感。** 点击**冲洗**,选择一种胶片,然后**保存**(回传到相机)或
**导出**(保存到你的手机)。
6. **拍摄超过 36 帧的更长胶卷。** 打开**预设 -> 胶卷大小**,输入你想要的帧数,
然后点击**设置胶卷大小**(`0` 清除胶卷)。
7. **使用完毕后,** 断开你的手机与相机 WiFi 的连接,并像往常一样使用相机。
## 面向开发者
- **在本地运行:** `python dev-server.py` 提供仓库服务(应用位于 `/src/index.html`,单文件位于
`/rewindpix.html`),**并**代理相机,因此所有操作都在同源下进行(需先加入相机的 WiFi)。`python dev-server.py --mock` 使用预设数据 + 占位符照片运行 —— **无需相机**。
- **或者使用普通的静态服务器:** `python -m http.server 8000`,然后打开 `http://localhost:8000/src/index.html`
(或从同一 WiFi 上的其他设备访问 `http://<你的电脑IP>:8000/…`)。
- **没有 HTTPS,这是设计使然:** 相机 API 是明文 `http://192.168.1.254`,并且浏览器会阻止
HTTPS 页面调用 HTTP 地址(“混合内容”)—— 因此这些工具运行在 `file://` 或 `http://` 下,
绝不使用 HTTPS(这也是为什么没有 GitHub Pages 站点的原因)。从相机的 SD 卡提供服务时,它们与
API 是**同源**的,因此 `fetch` 没有 CORS 或混合内容限制。
- **构建单文件:** `python build.py` 会将 `src/` 打包 -> `rewindpix.html`。
- **测试:** `npm test`(或 `node --test`)运行一个**封闭**测试套件(Node 的内置运行器,无依赖,无需相机/服务器/浏览器),位于 `test/` 目录中 —— 它在 `vm` 沙盒中针对进程内的模拟相机加载 `camera.js`/`zip.js`/`develop.js`,并检查命令编码、XML 解析器、已确认的
通信序列(设置时钟 `3005` -> `3006`,删除,胶卷,同步)、ZIP 结构以及 LUT 目录。
`dev-server.py --mock` 是用于手动/浏览器 QA 测试的匹配的**有状态**模拟器。
- **部署到相机上**(USB 上传对比 HFS 上传,电源循环重新索引)的详细信息请参阅
下文的[作为宿主的相机](#the-camera-as-a-host-hfs)。
## 注意事项
- 在相机不返回 CORS 头的情况下,工具是**触发即忘**的 —— 请求到达了相机
但无法读取回复,因此**请在相机屏幕上验证结果**。
- 相机是**单客户端**的,并且在快速连发请求下会卡死 —— 每次只能执行一个操作。
- **安装为应用:** 从相机的 WiFi 打开它,然后使用浏览器的**添加到主屏幕** —— 它
将以独立模式运行(manifest + 图标)。没有离线缓存:相机的局域网 IP 不是安全上下文,因此
service worker 无法注册(而且反正也没有什么可离线提供的服务 —— 相机就是后端)。
- 完整的协议参考:**[RewindPix / NT96565 WiFi API 说明](https://gist.github.com/chawasit/6b3912419dd7600c90361d8231757d79)**。
## 作为宿主的相机 (HFS)
插入 SD 卡后,**`http://192.168.1.254/`** 是相机的 **HFS 文件浏览器** (`hfs/1.00.000`):
它会**列出 SD 卡**,**按路径提供任何文件**(这就是工具运行的方式 —— 例如 `/index.html`,已确认),
显示每个文件旁边的**删除**链接(`?del=1`),并渲染**文件上传表单**。复制到 SD 根目录
会在 `http://192.168.1.254/.html` 上提供服务 —— 与相机 API **同源**,因此 `fetch` 没有 CORS
或混合内容限制,并且可以读取响应。
**将工具部署到相机:**
- **USB(可靠):** 在电脑上挂载 SD 卡,将工具的文件复制到卡**根目录**,安全弹出,然后
**对相机进行电源循环**(它会重新挂载 + 重新索引卡),并通过相机的 WiFi 打开 URL。
- **HFS 上传 —— 可上传至 `DCIM/`(已于 2026-07-09 更正):** 一个多部分 POST(字段 `fileupload1`,文件
部分在前)到 `/DCIM/…` 路径会**持久化** —— 文件会以正确的大小落到 `cmd=3015`
目录中,并且会自动创建任何缺失的子文件夹(例如 `Developed_Photos`)。有两个警告:**根目录上传会被
丢弃**(返回 `200` 但不写入),并且刚上传的文件的 **HTTP GET 在相机重新索引(电源循环)之前会提供 0 字节** —— 因此请通过目录确认写入,切勿通过回读确认。`?del=1` 会执行删除(已确认)。
- **注意:** 在 USB 会话刚结束时,相机会显示空文件列表 / 空间不足错误,直到其
进行电源循环;这是预期的,并非数据丢失。
## 许可证
**WTFPL** —— 见 [LICENSE](LICENSE)。你想干嘛就干嘛。
_关键词:RewindPix app 替代方案 · RewindPix app 更换方案 · 通过 WiFi 下载 RewindPix 照片 ·
解锁 RewindPix 胶卷容量 · 移除 36 张胶卷限制 · Novatek NT96565 / PS135 相机 API ·
浏览器内胶片 LUT 冲洗 · 逆向工程 RewindPix 工具。_
标签:后端开发, 图像处理, 多模态安全, 工具集, 摄像头配套, 数据可视化, 物联网工具, 网络连接监控, 胶片模拟, 逆向工具