Rust叠图软件分享
826 字
4 分钟
Rust叠图软件分享
水一篇,链接为:https://github.com/SIGMA-42-UwU/Rust-Image-Overlay
TIP:本项目大部分内容由DeepSeekV4-Flash协助完成,包括该介绍也为AI生成+人工润色
一个 Windows 桌面叠图工具:上传多张图片 → 自动转为黑白 → 在操作板上叠加、拖拽、调节图层 → 按两种模式合成 → 导出为任意支持的格式。
本项目由于作者打PuzzleHunt不会叠图而产生
- 后端:Rust(Tauri v2),
imagecrate 解码与合成,遵循 Rust API Guidelines,尽量用迭代器 / 函数式写法。 - 前端:Vue 3 + Vite。
- 支持平台:Windows(需要 WebView2,Win10/11 一般自带)。
功能
- 本地上传图片 — 支持 png / jpg / jpeg / webp / svg / gif / bmp / ico / tiff。
- 转黑白 — 上传后立即转为灰度图(
Luma8)。 - 操作板 — 拖拽文件到操作板导入(导入后需要对操作板进行操作才会显示最新导入的图片);图层有优先级,一次只选一个图层;选中后可拖动,也可直接输入 X/Y 坐标;可上移/下移/删除。
- 叠加模式
- 普通:同一像素位置,取各图层中更偏灰黑(更暗)的像素颜色。
- 严肃:先把所有非 (0,0,0) 像素转成 (255,255,255),再叠加(任一图层在该处有非黑像素即为白)。
- 导出 — PNG / JPEG / WebP / BMP / TIFF / GIF(按所选扩展名自动选择编码器)。
目录结构
Overlay/├─ src/ # 前端(Vue)│ ├─ App.vue # 布局 + 全局拖放导入│ ├─ store.js # 状态 + 与后端命令交互│ └─ components/│ ├─ LayerBoard.vue # 操作板(canvas:绘制/选中/拖动图层)│ └─ LayerPanel.vue # 图层列表 / 坐标输入 / 模式 / 导出├─ src-tauri/ # 后端(Rust + Tauri)│ ├─ src/│ │ ├─ lib.rs # 所有 Tauri 命令 + 叠加合成逻辑│ │ └─ main.rs│ ├─ examples/gen_icon.rs # 图标生成脚本│ ├─ tauri.conf.json│ ├─ capabilities/default.json│ └─ Cargo.toml├─ index.html / package.json / vite.config.js└─ README.md / LICENSE # MIT环境准备
- Rust:安装 rustup,装 stable
x86_64-pc-windows-msvc工具链。 - Node.js:安装 ≥ 18(推荐 20+)。在项目根目录执行
npm install。 - WebView2 Runtime:Win10/11 通常已内置;如缺失请到微软官网安装。
构建与运行
npm run tauri build# 直接构建可独立运行、不带安装器的可执行文件:# cd src-tauri && cargo build --release# 成品在 src-tauri/target/release/overlay.exe(内置前端,双击即用,无需 dev server)
# 开发模式(Vite 热更新 + Tauri 窗口)npm run tauri dev重要(关于 “localhost 拒绝连接”):
src-tauri/Cargo.toml里已把custom-protocol设为默认 feature。它让发布版把 Vue 前端内嵌进 exe, 通过tauri://协议加载,而不是访问devUrl。所以:
- 用
npm run tauri build或cargo build --release产出的 exe 独立可跑, 不再需要localhost上开一个服务。- 只有
npm run tauri dev(开发模式)才需要本机http://localhost:1420的 Vite server;如果 dev 窗口出现 “拒绝连接”,说明该 server 没起来 (重新执行npm run tauri dev即可)。- 注意:因为
custom-protocol默认开启,tauri dev加载的是最后一次dist构建的快照,不做前端热更新;要更新前端请先npm run build。
叠加逻辑核心(src-tauri/src/lib.rs)
// serious=false(普通):取各图层该像素中最暗的一个// serious=true (严肃):任一图层该像素非黑 -> 白。fn overlay(layers, width, height, serious) -> GrayImage {// 逐像素:normal 用 filter_map(...).min(),serious 用 any(is_some_and(|v| v>0))}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
三角函数公式简述
测试KATEX,含几个三角函数的公式
随机文章随机推荐








