手写作业生成器 — 使用 C++/Qt6 编写,通过自然扰动渲染文本以模拟手写效果。
支持 6 种纸张模板:横线纸、方格纸、田字格、作文纸、点阵纸、纯色背景,可调透明度。 选择纹理后自动对齐文字到网格线。
- 自定义背景 — 支持加载纸的照片作为背景
- 四点锚点校准 — 点击纸的四个角,文字通过透视变换自动映射到歪斜纸张上
- 即使照片中的纸位置不正、角度倾斜,文字也能准确贴合
- 笔画粗细扰动 — 模拟用力不均
- 墨水洇染 — 笔迹边缘羽化效果
- 涂改模拟 — 随机划线删除
- 段首缩进两字符
- 段间距独立设置
- Markdown 轻标记:
# 标题、~~删除线~~、---分割线
- 实时自动预览(参数变化 500ms 后刷新)
- 可拖拽分隔条 — 预览区和设置栏宽度自由调节
- PDF 导出
- 多预设管理(保存/加载/删除)
- 字符级别属性覆盖
- 缩放、翻页、打印
- MSYS2 (ucrt64)
- GCC 16+
- CMake 3.16+
- Qt 6.11+
pacman -S mingw-w64-ucrt-x86_64-gcc \
mingw-w64-ucrt-x86_64-cmake \
mingw-w64-ucrt-x86_64-ninja \
mingw-w64-ucrt-x86_64-qt6-basemkdir build && cd build
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release
ninja双击 HandWrite.exe,或:
cd G:\build\build_gcc
.\HandWrite.exe- 点击「选择...」载入纸的照片
- 点击「锚点」打开校准窗口
- 依次点击纸的四个角:左上 → 右上 → 右下 → 左下
- 可拖拽红点微调,点击「确定」保存
- 预览中的文字将通过透视变换贴合到纸上
# 基本用法
handwrite-cli -t "文本内容" -o ./output -r 2
# 从文件读取 + 预设配置
handwrite-cli -i input.txt -p presets/语文作业.conf
# 导出 PDF
handwrite-cli -t "内容" -f pdf -o ./output
# 管道输入
echo "文本" | handwrite-cli -o ./out选项:
| 参数 | 说明 |
|---|---|
-t, --text |
直接指定文本 |
-i, --input |
输入文件路径 |
-o, --output |
输出目录 (默认: outputs) |
-p, --preset |
预设配置文件 (.conf) |
-r, --rate |
分辨率倍率 (1/2/4/8/16/32/64) |
-f, --format |
输出格式 (png/pdf) |
将 .ttf 手写字体文件放入 ttf_library/ 目录,程序启动时自动加载。
- 锚点校准优化:修复四角↔精细模式切换时角点复位 bug(行列按钮改用插值、角点提取用网格坐标)
- 网页更新:新增输出效果对比与锚点模式展示图片
- 锚点校准重构:默认进入「四角模式」,只拖 4 个角快速定位,内部网格自动双线性插值;可切换到「精细模式」逐点微调
- Bug 修复:修复 warpMesh 在锚点校准下的文字裁切回归 bug
- Web:新增产品展示页(
Web/index.html),版本号从 GitHub API 实时拉取
- 数据安全:输出目录不再递归清空,改为只删除本程序生成的页码图片(如
0.png),避免误删用户目录下的其他文件 - 中文标点:修复
。!?等中文标点无法整字换行的问题 - 字体缓存:混合字体改为带
QMutex缓存的注册,修复每字符重复注册导致的内存泄漏与多线程竞态 - 竖排导出:旋转后由左上角裁切改为居中裁切,修复宽大于高时丢内容
- CLI 批量:去除行尾
\r,坏文件仅跳过而不中断整批 - 性能:墨水洇染由 O(W·H·r²) 优化为 O(W·H·r),高倍率不再卡死;网格形变每格只重绘对应子矩形
- 工程:版本号统一为单一来源(CMake 注入
HANDWRITE_VERSION);CMake 现代度提升(target_include_directories、find_package(WebP));配置文件文档统一为.conf;Circle 形变按行基线偏移避免多行重叠