浏览器里的漫画汉化工作台:框选 → AI 重绘(或手动搬运)→ 嵌字 → 批量导出。 支持 Gemini 与任意 OpenAI 兼容生图接口;可选 Python 后端提供气泡检测(RT-DETR)、文字擦除与字体服务。
前端是纯本地运行的 React 应用(图片不上传到除你自己配置的 AI 接口以外的任何地方),后端是为了「自动检测气泡 / 高质量擦字」准备的本地服务。没有后端也能用:只用手动框选 + AI 重绘 或 手动修补工坊即可。
图库与导入
Ctrl+V 粘贴剪贴板截图选区与提示词
Delete / Backspace 删除选中框;画布右下角缩放控件生图链路
@google/genai)或 OpenAI 兼容接口(Chat Completions / Images Edits 两种形态)发送前的图像预处理
翻译与嵌字
结果与导出
编辑器(汉化流水线)
可选 Python 后端
界面与持久化
在左栏「工作流模式」中切换:
| 模式 | 出图方 | 适合 |
|---|---|---|
| AI 重绘 | 你配置的生图接口 | 有可用 API、想批量出图的场景。框选后直接点「开始重绘」 |
| 手动修补工坊 | 外部 AI(网页版 Gemini、任意生图站) | 没有生图接口,或外部网站效果更好。工坊负责切片、补方、复制与回填(Ctrl+V) |
| 编辑器 | 不调用生图接口 | 漫画汉化流水线:擦字 → 翻译 → 自动嵌字,纯前端 + 可选后端 |
应用内左栏右上角的 ? 按钮(使用手册 & 技巧)也有简单的说明。
npm install
npm run dev # http://localhost:3000
构建与预览:
npm run build
npm run preview
pip install -r server/requirements.txt
python server/app.py # 监听 0.0.0.0:5001
Windows 也可以直接双击 server/启动服务.bat(会优先使用脚本里配置的 Anaconda Python,找不到则回退到 PATH 中的 python)。
启动后:
http://localhost:5001在项目根目录创建 .env:
GEMINI_API_KEY=your_key_here
vite.config.ts 会把它注入为 process.env.API_KEY / process.env.GEMINI_API_KEY,作为 Gemini 密钥的默认值(也可以在应用里直接填写并保存)。
多数情况下不需要
.env:在右侧「连接设置」里填 Base URL / Key / Model 即可,配置会保存在浏览器本地。
统一服务入口 server/app.py,默认端口 5001(MAX_CONTENT_LENGTH 16 MB,全部接口都支持 multipart/form-data 上传或 JSON base64)。
| 端点 | 方法 | 说明 |
|---|---|---|
/health | GET | 健康检查:设备(cuda/cpu)、模型名、模型是否已加载 |
/detect | POST | RT-DETR 文本 / 气泡检测。返回 bubble / text_bubble / text_free 三类框及置信度,可传 conf_threshold、filter_classes |
/erase | POST | 区域文字擦除(flood fill 洞检测 + OpenCV inpaint)。kind=bubble|free、dilate、inpaint_radius;返回 PNG,并在响应头回传实测取色 X-Text-Color / X-Bg-Color / X-Text-Ratio |
/fonts | GET | 编辑器可用字体列表(含是否已缓存到 server/fonts/) |
/fonts/<id> | GET | 字体文件本体,首次请求时由后端下载并缓存,之后直接读本地 |
模型在服务启动时预加载;加载失败不会缓存失败状态,首次 /detect 会自动重试。
气泡检测使用 Hugging Face 上的社区模型 ogkalu/comic-text-and-bubble-detector(RT-DETR-v2),权重缓存在:
server/model/
└─ models--ogkalu--comic-text-and-bubble-detector/ # 标准 HuggingFace 缓存布局
├─ blobs/ # 权重与配置实体(model.safetensors ≈ 163 MB)
├─ refs/main
└─ snapshots/<commit>/ # config.json / model.safetensors / preprocessor_config.json
transformers 会按需从 Hugging Face 下载到该目录(约 163 MB 权重)。server/model/ 目录拷贝到目标机器即可,无需联网。server/inference_rtdetr.py(RTDetrForObjectDetection + RTDetrImageProcessor,自动选择 cuda / mps / cpu)。bananaChange/
├─ App.tsx 应用主壳:图库、画布、视图切换、快捷键、导出
├─ index.tsx / index.html 前端入口
├─ index.css Tailwind 主题(skin-* 变量、浅色/深色)
├─ types.ts Region / UploadedImage / AppConfig 等核心类型
├─ components/
│ ├─ Sidebar.tsx 左栏:图库、工作流模式、正方形补全、漫画工具箱
│ ├─ WorkflowDock.tsx 右侧停靠栏:提示词 / 连接设置 / 处理选项 / 执行
│ ├─ EditorCanvas.tsx 画布:框选、拖动缩放、状态徽标、缩放控件
│ ├─ EditorDock.tsx 编辑器属性面板(文字 / 画笔)
│ ├─ GlobalSettings.tsx 全局设置:常规 / 漫画与重绘 / 翻译 / 数据管理
│ ├─ PayloadInspector.tsx 发送记录查看器
│ ├─ HelpModal.tsx 使用手册 & 技巧
│ └─ sidebar/ 侧栏子组件(设置面板、工坊条目、帮助提示、API 配置组…)
├─ hooks/
│ ├─ useConfig.ts 配置默认值、localStorage 读写与旧配置迁移
│ ├─ useImageManager.ts 图库增删、历史(撤销/重做)、应用为原图
│ ├─ useImageProcessor.ts 重绘主流程:切片 → 遮罩 → 补方 → 调用 → 回填
│ ├─ useCanvasInteraction.ts 画布框选与拖拽交互
│ └─ useMangaEditor.ts 编辑器:擦除、嵌字、画笔、翻译
├─ services/
│ ├─ aiService.ts / geminiService.ts 生图与翻译接口调用、重试
│ ├─ imageUtils.ts 裁切、遮罩合成、补方 / 裁回、编解码
│ ├─ textErase.ts / textLayout.ts 纯前端擦字算法、排版(避头尾/竖排)
│ ├─ detectionService.ts / fontService.ts 后端检测与字体接口
│ ├─ editorTranslate.ts / glossary.ts / translationCache.ts 整页翻译、术语表、译文缓存
│ ├─ sessionStore.ts 会话持久化(IndexedDB)
│ ├─ workbenchCopy.ts 工坊剪贴板(图文/纯文本,多级降级)
│ ├─ payloadLog.ts 发送记录
│ ├─ configTransfer.ts / workStateTransfer.ts / downloadZip.ts 配置与工作状态备份、打包导出
│ ├─ concurrencyUtils.ts / rateLimitGate.ts 并发与限流
│ └─ translations.ts 中英文案(含使用手册内容)
└─ server/ Python 后端:app.py(Flask)、erase.py、inference_rtdetr.py
├─ model/ 检测模型缓存(见上一节)
├─ fonts/ 字体缓存(按需下载)
├─ requirements.txt
└─ 启动服务.bat
| 按键 | 作用 |
|---|---|
↑ ↓ ← → | 上一张 / 下一张图片 |
Ctrl+V | 粘贴剪贴板图片;在工坊的「回填区」粘贴 AI 结果 |
Delete / Backspace | 删除当前选中的框 |
Ctrl+滚轮 | 缩放画布;编辑器里光标悬停在选中的框上时 = 调字号 |
Shift+滚轮 | 编辑器里光标悬停在选中的框上时 = 微调文字旋转角(±5°,加 Alt = ±1°) |
Esc | 关闭使用手册与各类弹窗;取消编辑器的「测角」 |
Alt / 中键 / 空格 + 拖 | 平移画布 |
完整一览见应用内「使用手册 → 快捷键」。
图片级撤销 / 重做没有快捷键,用画布左上角的两个圆形箭头按钮;编辑器内的擦除撤回是右栏的独立按钮。
| 开关 | 位置 | 要解决的问题 |
|---|---|---|
| 正方形补全(默认开) | 左栏「工作流模式」 | AI 返回图被拉成方形、比例失真 |
| 启用翻译模式 | 全局设置 → 翻译 | 先识译原文,重绘时把译文交给模型画字 |
| 重绘前先翻译 / 必须翻译 | 全局设置 → 翻译 | 两阶段解耦,或回退到旧版一步到位 |
| 使用全图遮罩模式 | 全局设置 → 漫画与重绘 | 减少 API 调用次数、提供整页上下文 |
| 反向遮罩模式 | 全局设置 → 漫画与重绘 | 保留主体、只重画背景(与补方互斥) |
| 压缩发送给 AI 的图片 | 全局设置 → 漫画与重绘 | 省 token、加快上传 |
| 性能模式 | 全局设置 → 常规 | 大图库预览占内存 / 切图卡顿(只影响预览) |
| 会话持久化 | 全局设置 → 常规 | 刷新或标签页休眠后不丢失编辑现场 |
| 显示重试诊断 | 右侧「处理选项」 | 排查频繁失败的图片 |
localStorage + IndexedDB),只有调用 AI 接口时才发送裁剪 / 遮罩后的图片。transformers 的 RTDetrForObjectDetection / RTDetrImageProcessor 加载)bubble(气泡)、text_bubble(气泡内文字)、text_free(气泡外文字)本仓库当前未附带开源许可证文件;如需二次分发,请先与仓库作者确认,并同时遵守上述第三方模型与库各自的许可条款。
15 followers · starred Feb 2026
浏览器里的漫画汉化工作台:框选 → AI 重绘(或手动搬运)→ 嵌字 → 批量导出。 支持 Gemini 与任意 OpenAI 兼容生图接口;可选 Python 后端提供气泡检测(RT-DETR)、文字擦除与字体服务。
前端是纯本地运行的 React 应用(图片不上传到除你自己配置的 AI 接口以外的任何地方),后端是为了「自动检测气泡 / 高质量擦字」准备的本地服务。没有后端也能用:只用手动框选 + AI 重绘 或 手动修补工坊即可。
图库与导入
Ctrl+V 粘贴剪贴板截图选区与提示词
Delete / Backspace 删除选中框;画布右下角缩放控件生图链路
@google/genai)或 OpenAI 兼容接口(Chat Completions / Images Edits 两种形态)发送前的图像预处理
翻译与嵌字
结果与导出
编辑器(汉化流水线)
可选 Python 后端
界面与持久化
在左栏「工作流模式」中切换:
| 模式 | 出图方 | 适合 |
|---|---|---|
| AI 重绘 | 你配置的生图接口 | 有可用 API、想批量出图的场景。框选后直接点「开始重绘」 |
| 手动修补工坊 | 外部 AI(网页版 Gemini、任意生图站) | 没有生图接口,或外部网站效果更好。工坊负责切片、补方、复制与回填(Ctrl+V) |
| 编辑器 | 不调用生图接口 | 漫画汉化流水线:擦字 → 翻译 → 自动嵌字,纯前端 + 可选后端 |
应用内左栏右上角的 ? 按钮(使用手册 & 技巧)也有简单的说明。
npm install
npm run dev # http://localhost:3000
构建与预览:
npm run build
npm run preview
pip install -r server/requirements.txt
python server/app.py # 监听 0.0.0.0:5001
Windows 也可以直接双击 server/启动服务.bat(会优先使用脚本里配置的 Anaconda Python,找不到则回退到 PATH 中的 python)。
启动后:
http://localhost:5001在项目根目录创建 .env:
GEMINI_API_KEY=your_key_here
vite.config.ts 会把它注入为 process.env.API_KEY / process.env.GEMINI_API_KEY,作为 Gemini 密钥的默认值(也可以在应用里直接填写并保存)。
多数情况下不需要
.env:在右侧「连接设置」里填 Base URL / Key / Model 即可,配置会保存在浏览器本地。
统一服务入口 server/app.py,默认端口 5001(MAX_CONTENT_LENGTH 16 MB,全部接口都支持 multipart/form-data 上传或 JSON base64)。
| 端点 | 方法 | 说明 |
|---|---|---|
/health | GET | 健康检查:设备(cuda/cpu)、模型名、模型是否已加载 |
/detect | POST | RT-DETR 文本 / 气泡检测。返回 bubble / text_bubble / text_free 三类框及置信度,可传 conf_threshold、filter_classes |
/erase | POST | 区域文字擦除(flood fill 洞检测 + OpenCV inpaint)。kind=bubble|free、dilate、inpaint_radius;返回 PNG,并在响应头回传实测取色 X-Text-Color / X-Bg-Color / X-Text-Ratio |
/fonts | GET | 编辑器可用字体列表(含是否已缓存到 server/fonts/) |
/fonts/<id> | GET | 字体文件本体,首次请求时由后端下载并缓存,之后直接读本地 |
模型在服务启动时预加载;加载失败不会缓存失败状态,首次 /detect 会自动重试。
气泡检测使用 Hugging Face 上的社区模型 ogkalu/comic-text-and-bubble-detector(RT-DETR-v2),权重缓存在:
server/model/
└─ models--ogkalu--comic-text-and-bubble-detector/ # 标准 HuggingFace 缓存布局
├─ blobs/ # 权重与配置实体(model.safetensors ≈ 163 MB)
├─ refs/main
└─ snapshots/<commit>/ # config.json / model.safetensors / preprocessor_config.json
transformers 会按需从 Hugging Face 下载到该目录(约 163 MB 权重)。server/model/ 目录拷贝到目标机器即可,无需联网。server/inference_rtdetr.py(RTDetrForObjectDetection + RTDetrImageProcessor,自动选择 cuda / mps / cpu)。bananaChange/
├─ App.tsx 应用主壳:图库、画布、视图切换、快捷键、导出
├─ index.tsx / index.html 前端入口
├─ index.css Tailwind 主题(skin-* 变量、浅色/深色)
├─ types.ts Region / UploadedImage / AppConfig 等核心类型
├─ components/
│ ├─ Sidebar.tsx 左栏:图库、工作流模式、正方形补全、漫画工具箱
│ ├─ WorkflowDock.tsx 右侧停靠栏:提示词 / 连接设置 / 处理选项 / 执行
│ ├─ EditorCanvas.tsx 画布:框选、拖动缩放、状态徽标、缩放控件
│ ├─ EditorDock.tsx 编辑器属性面板(文字 / 画笔)
│ ├─ GlobalSettings.tsx 全局设置:常规 / 漫画与重绘 / 翻译 / 数据管理
│ ├─ PayloadInspector.tsx 发送记录查看器
│ ├─ HelpModal.tsx 使用手册 & 技巧
│ └─ sidebar/ 侧栏子组件(设置面板、工坊条目、帮助提示、API 配置组…)
├─ hooks/
│ ├─ useConfig.ts 配置默认值、localStorage 读写与旧配置迁移
│ ├─ useImageManager.ts 图库增删、历史(撤销/重做)、应用为原图
│ ├─ useImageProcessor.ts 重绘主流程:切片 → 遮罩 → 补方 → 调用 → 回填
│ ├─ useCanvasInteraction.ts 画布框选与拖拽交互
│ └─ useMangaEditor.ts 编辑器:擦除、嵌字、画笔、翻译
├─ services/
│ ├─ aiService.ts / geminiService.ts 生图与翻译接口调用、重试
│ ├─ imageUtils.ts 裁切、遮罩合成、补方 / 裁回、编解码
│ ├─ textErase.ts / textLayout.ts 纯前端擦字算法、排版(避头尾/竖排)
│ ├─ detectionService.ts / fontService.ts 后端检测与字体接口
│ ├─ editorTranslate.ts / glossary.ts / translationCache.ts 整页翻译、术语表、译文缓存
│ ├─ sessionStore.ts 会话持久化(IndexedDB)
│ ├─ workbenchCopy.ts 工坊剪贴板(图文/纯文本,多级降级)
│ ├─ payloadLog.ts 发送记录
│ ├─ configTransfer.ts / workStateTransfer.ts / downloadZip.ts 配置与工作状态备份、打包导出
│ ├─ concurrencyUtils.ts / rateLimitGate.ts 并发与限流
│ └─ translations.ts 中英文案(含使用手册内容)
└─ server/ Python 后端:app.py(Flask)、erase.py、inference_rtdetr.py
├─ model/ 检测模型缓存(见上一节)
├─ fonts/ 字体缓存(按需下载)
├─ requirements.txt
└─ 启动服务.bat
| 按键 | 作用 |
|---|---|
↑ ↓ ← → | 上一张 / 下一张图片 |
Ctrl+V | 粘贴剪贴板图片;在工坊的「回填区」粘贴 AI 结果 |
Delete / Backspace | 删除当前选中的框 |
Ctrl+滚轮 | 缩放画布;编辑器里光标悬停在选中的框上时 = 调字号 |
Shift+滚轮 | 编辑器里光标悬停在选中的框上时 = 微调文字旋转角(±5°,加 Alt = ±1°) |
Esc | 关闭使用手册与各类弹窗;取消编辑器的「测角」 |
Alt / 中键 / 空格 + 拖 | 平移画布 |
完整一览见应用内「使用手册 → 快捷键」。
图片级撤销 / 重做没有快捷键,用画布左上角的两个圆形箭头按钮;编辑器内的擦除撤回是右栏的独立按钮。
| 开关 | 位置 | 要解决的问题 |
|---|---|---|
| 正方形补全(默认开) | 左栏「工作流模式」 | AI 返回图被拉成方形、比例失真 |
| 启用翻译模式 | 全局设置 → 翻译 | 先识译原文,重绘时把译文交给模型画字 |
| 重绘前先翻译 / 必须翻译 | 全局设置 → 翻译 | 两阶段解耦,或回退到旧版一步到位 |
| 使用全图遮罩模式 | 全局设置 → 漫画与重绘 | 减少 API 调用次数、提供整页上下文 |
| 反向遮罩模式 | 全局设置 → 漫画与重绘 | 保留主体、只重画背景(与补方互斥) |
| 压缩发送给 AI 的图片 | 全局设置 → 漫画与重绘 | 省 token、加快上传 |
| 性能模式 | 全局设置 → 常规 | 大图库预览占内存 / 切图卡顿(只影响预览) |
| 会话持久化 | 全局设置 → 常规 | 刷新或标签页休眠后不丢失编辑现场 |
| 显示重试诊断 | 右侧「处理选项」 | 排查频繁失败的图片 |
localStorage + IndexedDB),只有调用 AI 接口时才发送裁剪 / 遮罩后的图片。transformers 的 RTDetrForObjectDetection / RTDetrImageProcessor 加载)bubble(气泡)、text_bubble(气泡内文字)、text_free(气泡外文字)本仓库当前未附带开源许可证文件;如需二次分发,请先与仓库作者确认,并同时遵守上述第三方模型与库各自的许可条款。
15 followers · starred Feb 2026