尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证本地优先的胶片扫描工具:识别、切分、旋转、批量导出与半格拼图 | Local-first browser tools for detecting, splitting, rotating, batch-exporting, and composing film scans.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
一个在浏览器本地运行的胶片图像处理工具合集。图像解码、编辑与导出均在本地完成,不会上传到服务器。 • 支持批量导入 TIFF、JPEG、PNG 和 WebP,也可将文件直接拖入页面。 • 自动识别每张扫描图像的分割位置与中缝宽度,并允许手动微调。 • 两侧画面可分别旋转,也可将当前设置应用到全部图像。 • 支持导出 JPEG、PNG、WebP 与 TIF,并将批量结果打包为 ZIP 下载。 • JPEG 与 WebP 导出支持调整输出质量。查看完整 README ↗
一个在浏览器本地运行的胶片图像处理工具合集。图像解码、编辑与导出均在本地完成,不会上传到服务器。
FXF1. 开头的字符串(JSON 经 DEFLATE 压缩后以 base64url 编码),可直接在聊天或网址中传递;导入时会逐项校验并限制在界面允许的范围内,无效的项目保持当前设置。页面顶部的横向菜单用于在三项工具之间切换。工具页面会保留工作状态,切换后返回不会丢失已导入的图像。
Film X 提供一个本地 stdio MCP 服务(工作区包 packages/mcp,名称 film-x-mcp),让 Claude Desktop、ChatGPT Desktop、Codex CLI 等支持 MCP 的桌面 AI Agent 直接运行三项工具并取得生成的图片。
/mcp-renderer,随网站一同部署到 Cloudflare Pages)。服务通过仅监听回环地址(127.0.0.1,随机端口)的反向代理,在无头模式的 Google Chrome 或 Microsoft Edge(playwright-core)中加载该页面,因此输出与网页版由同一份 app/utils 代码绘制(字体、标志、齿孔、EXIF 方向均一致)。GET / HEAD 请求,且不带 Cookie;无头浏览器中会阻止网站的 Service Worker;带内容哈希的 _nuxt 资源在服务运行期间缓存在内存中。每次启动浏览器时都需要能访问该网站(首次任务以及空闲 5 分钟关闭后的下一次任务)。/mcp-renderer);否则首个任务会失败,并提示部署 0.6.0 及以上版本或设置 FILM_X_SITE_URL。compose_film 与 frame_photo 输出 WebP 需网站为 0.7.0 或更高版本:渲染前服务会先检查,网站较旧时工具报错并提示改用 jpeg/png 或部署 0.7.0+,不会把 JPEG 数据写进 .webp 文件。服务与页面共用渲染协议版本,版本不一致时错误信息会指明应更新哪一侧:重新部署网站,或重新构建 / 更新 MCP 服务。FILM_X_SITE_URL 只应指向你信任的 Film X 部署,通常是你自己的部署。FILM_X_BROWSER_PATH 指定其他基于 Chromium 的浏览器可执行文件;浏览器空闲 5 分钟后自动关闭。macOS / Linux:
curl -fsSL https://filmx.nya.run/mcp/install.sh | sh
Windows(PowerShell 5.1 或 7):
irm https://filmx.nya.run/mcp/install.ps1 | iex
网站构建时会在 /mcp/ 下发布 install.sh、install.ps1、server.mjs、package.json 和 SHA256SUMS。仅当网站运行 0.6.0 或更高版本时才可用;在此之前下载会返回 404,脚本会提示网站需运行 Film X 0.6.0 或更高版本。两个脚本的步骤相同:
SHA256SUMS;若与已安装副本一致且已安装的服务仍能启动(server.mjs --version),则提示“已是最新版本”并跳过下载与 npm install(仍会打印配置,以便采用新的 Node.js 路径)。否则从 <站点>/mcp/ 下载文件并校验 SHA-256(SHA256SUMS 也列出 install.sh 与 install.ps1)。npm install --omit=dev 安装依赖(需要能访问 npm 仓库),再确认 server.mjs --version 可运行。~/.film-x-mcp(Windows 为 %LOCALAPPDATA%\film-x-mcp;可用 FILM_X_MCP_HOME 修改):新副本先在目标旁暂存再移入;仅当已有文件夹由之前的安装脚本创建(带标记文件)时才会替换,其他文件夹一律拒绝。node server.mjs --print-config 打印可直接粘贴的 Claude Desktop(JSON)和 ChatGPT Desktop / Codex(~/.codex/config.toml,或 设置 → MCP 服务器 → 添加服务器 → STDIO)配置,其中已填入该 Node.js 的绝对路径和已安装的 server.mjs,并标明各平台的配置文件位置(Claude Desktop 在 Windows 为 %APPDATA%\Claude\claude_desktop_config.json,在 macOS 为 ~/Library/Application Support/Claude/claude_desktop_config.json;Codex / ChatGPT Desktop 在 Windows 为 %USERPROFILE%\.codex\config.toml,在 macOS / Linux 为 ~/.codex/config.toml);当 FILM_X_SITE_URL 不是默认值时,配置中会包含它。脚本不会修改任何 Agent 配置,也不会上传任何内容。在 Windows 上,如需修改环境变量请先设置,例如 $env:FILM_X_MCP_HOME = 'D:\film-x-mcp'。出错时安装脚本会抛出错误而不是退出,因此 PowerShell 窗口不会被关闭。FILM_X_SITE_URL 指定安装来源及渲染所用的网站(默认 https://filmx.nya.run/;仅限 https,http 只允许 localhost)。
install.sh 与 install.ps1 的副本,以及记录安装来源网站的 site-url 文件;直接运行保留的副本即可从该网站更新同一文件夹,无需设置环境变量(设置了 FILM_X_SITE_URL / FILM_X_MCP_HOME 时仍以其为准):macOS / Linux 运行 sh ~/.film-x-mcp/install.sh,Windows 运行 powershell -NoProfile -ExecutionPolicy Bypass -File "%LOCALAPPDATA%\film-x-mcp\install.ps1"。安装 / 更新结束时打印的配置末尾会附上该安装对应的更新命令。node server.mjs --print-config;server.mjs 还支持 --version / --help。mise exec -- pnpm install
mise exec -- pnpm mcp:build
产物仅有 packages/mcp/dist/server.mjs。
图形界面应用不会继承 shell 的 PATH(mise、fish 等),因此配置中必须使用 node 的绝对路径(mise which node 会输出,例如 /Users/you/.local/share/mise/installs/node/24/bin/node)以及 dist/server.mjs 的绝对路径。
安装脚本会打印已填好的此配置。
编辑配置文件(macOS 为 ~/Library/Application Support/Claude/claude_desktop_config.json,也可在 设置 → 开发者 → 编辑配置 中打开),然后重启 Claude Desktop:
{
"mcpServers": {
"film-x": {
"command": "/absolute/path/to/node",
"args": ["/absolute/path/to/film-x/packages/mcp/dist/server.mjs"],
"env": {
"FILM_X_IMAGE_DIR": "/Users/you/Pictures/Scans",
"FILM_X_SITE_URL": "https://filmx.nya.run/"
}
}
}
}
安装脚本会打印已填好的此配置。
ChatGPT Desktop 使用 Codex 宿主的 MCP 配置,与 Codex CLI 和 IDE 扩展共用。可在 设置 → MCP 服务器 → 添加服务器 → STDIO 中填写命令与参数,或编辑 ~/.codex/config.toml:
[mcp_servers.film-x]
command = "/absolute/path/to/node"
args = ["/absolute/path/to/film-x/packages/mcp/dist/server.mjs"]
startup_timeout_sec = 30
# 处理大批量 TIFF 可能超过默认的 60 秒,因此调大工具超时。
tool_timeout_sec = 600
env = { FILM_X_IMAGE_DIR = "/Users/you/Pictures/Scans", FILM_X_SITE_URL = "https://filmx.nya.run/" }
已知问题:部分 ChatGPT Desktop 版本中,本地 MCP 工具能被发现,但不会在普通 Chat 会话中提供(见 openai/codex#38162);在 Codex CLI 和桌面端的 Work 界面中可正常使用。
FILM_X_IMAGE_DIR:list_images 默认列出的文件夹。FILM_X_SITE_URL:网站的基础 URL,默认 https://filmx.nya.run/。必须为 https;仅 localhost / 127.0.0.1 / [::1] 允许 http,用于本地测试。支持子路径部署,例如 https://example.com/film-x/。FILM_X_BROWSER_PATH:浏览器可执行文件路径,用于覆盖自动查找的 Chrome / Edge。FILM_X_MCP_HOME:安装文件夹,默认 ~/.film-x-mcp(仅安装脚本使用)。list_images:列出文件夹中受支持的图片(TIFF、JPEG、PNG、WebP),可递归。read_photo_exif:读取 EXIF、识别品牌、数码或胶片来源及说明字段,与相框工具自动填写的结果一致。split_half_frame:切分一张或多张半格扫描图,输出 <name>_01 / <name>_02(JPEG、PNG、WebP 或 TIF);未指定中心与间隙时自动识别中缝;两侧可分别旋转。compose_film:将 1–2 张照片排成半格或全画幅拼图,支持方向、比例(如 auto 或 4:5)、外边距、画面间距、背景、底纹、填充方式、齿孔带与边缘文字、胶片质感;默认在第一张照片旁输出 film-x-layout.jpg|png|webp;格式可选 JPEG、PNG 或 WebP,quality 适用于 JPEG 与 WebP(0.7–1,更低的值按 0.7 处理)。frame_photo:为一张照片添加相框,可指定模板、品牌、部分设置和/或网页版的 FXF1. 预设码,默认开启 EXIF 自动填写,并可覆盖说明文字;输出 <name>-frame.jpg|png|webp(格式可选 JPEG、PNG 或 WebP,也可用 .webp 结尾的输出路径;quality 适用于 JPEG 与 WebP,0.7–1),并返回最终设置对应的预设码,可直接粘贴到网页版。frame_preset:只解析相框设置或预设码而不渲染(只读)。使用说明:
~/…。聊天中的附件服务端不可见,请直接提供文件或文件夹路径。overwrite: true),也绝不会写入输入文件本身;返回输出路径、像素尺寸和一张小的 JPEG 预览(长边不超过 1024 px),供 Agent 查看(preview: false 可关闭)。应用框架与界面:Nuxt 4 + Vue 3 + shadcn-vue + Reka UI + Tailwind CSS
语言与主题:@nuxtjs/i18n + @nuxtjs/color-mode
图像与压缩:UTIF + fflate
相框字体:@fontsource(OFL 开源字体,仅打包拉丁字符子集)
安装、离线与更新:@vite-pwa/nuxt + Workbox
代码检查与格式化:TypeScript + Oxlint + Oxfmt
MCP:@modelcontextprotocol/sdk + playwright-core(系统 Chrome / Edge)
项目使用 mise 管理 Node.js 版本,当前配置为 Node.js 24。
mise install
mise exec -- pnpm install
mise exec -- pnpm dev
开发服务器默认运行在 http://localhost:3000。
mise exec -- pnpm check
mise exec -- pnpm test:pwa
mise exec -- pnpm test:app
mise exec -- pnpm test:mcp
mise exec -- pnpm build
test:pwa 使用 Node 原生回归测试验证多窗口空闲、忙碌、无响应、关闭、作用域、重试及并发消息下的更新激活条件。
test:app 用 Node 原生测试直接运行 app/utils 中的纯逻辑(切分矩形、EXIF 解析、相框预设码、拼图尺寸边界),无需浏览器;test 依次运行 test:pwa 与 test:app。
test:mcp 会先运行 pnpm generate(其中会构建 MCP 包),再运行 packages/mcp/tests/*.test.mjs:在本地端口上提供生成的 .output/public,通过代理对其运行测试,其中 install.test.mjs 会针对生成的站点在临时文件夹中运行真实的 curl … | sh 一键安装命令,检查打印的配置、启动已安装的服务,并验证原地更新以及对非安装脚本创建的文件夹的拒绝;能找到 PowerShell(FILM_X_PWSH 或 PATH 中的 pwsh)时,还会以 irm … | iex 运行 install.ps1,否则跳过这一项(npm 安装需要能访问 npm 仓库)。测试并使用 git 忽略的 sample/ 文件夹(或 FILM_X_SAMPLE)中的第一张图片进行验证;没有可用图片时会跳过。设置 FILM_X_SITE_URL 后,测试会改为针对已部署的网站运行。
check 会依次执行格式检查、Oxlint 和 Nuxt 类型检查。需要生成静态站点或预览构建结果时,可使用:
mise exec -- pnpm generate
mise exec -- pnpm preview
开发模式不注册 Service Worker。测试生产 PWA 时,请先运行 mise exec -- pnpm build,再运行 mise exec -- pnpm preview;或运行 mise exec -- pnpm generate,通过静态服务器提供 .output/public。测试环境同样需要 HTTPS 或 localhost。
NUXT_APP_BASE_URL 配置子路径;构建和部署时应使用一致的基础路径。sw.js、pwa-update-guard.js、manifest.webmanifest 和 HTML 应设置 Cache-Control: no-cache,让浏览器及时重新验证更新。静态托管平台需自行配置这些响应头。_nuxt hash 资源,避免仍运行旧版本的窗口加载失败。pnpm generate 与 pnpm build 都会先运行 pnpm mcp:build)会在 /mcp/ 下发布 MCP 一键安装文件(install.sh、install.ps1、server.mjs、package.json、SHA256SUMS),它们不会被 PWA Service Worker 预缓存。因此 Pages 的构建命令必须是 pnpm generate(或 pnpm build),不能直接运行 nuxt generate。public/_headers 会让 Pages 以纯文本返回这两个安装脚本,并对 /mcp/ 下的文件始终重新验证。app/pages:半格切分、排版拼图与照片相框页面,以及各自的工作流编排。app/components/film:通用的上传、图像队列、预览、参数控制与导出组件。app/composables:文件队列、自动识别、图像预览和批量导出状态。app/types:图像条目、切分设置与导出格式等共享类型。app/utils:图像解码、检测、裁切、旋转、格式转换、EXIF 读取与相框绘制工具。app/assets/css:全局主题、颜色、基础控件样式与相框字体引入。app/assets/frame-logos:相框使用的相机品牌标志 SVG 及其来源说明。public:favicon、PWA 图标与更新保护脚本 pwa-update-guard.js 等公开静态资源。packages/mcp:本地 MCP 服务(Node):回环代理、文件传输与工具定义;install.sh / install.ps1 为一键安装脚本,scripts/build-site.mjs 将安装文件生成到 dist/site 并在网站构建时发布到 /mcp/。app/pages/mcp-renderer.vue 与 app/utils/agentRenderer.ts。半格切分工作流复用了个人项目 Full2Half 的源码,并在 Film X 的统一页面结构与主题系统中重新组织。
本项目采用 Apache License 2.0(Apache-2.0)许可。